這可能是回答某處,但我不知道要搜索什麼。想象一下,你有以下...實例變量調用在你做什麼時工作A thing = new B();其中B是A的一個子類?
超類,Animal.java
public class Animal {
public String noise = "squeak";
public String toString() { return noise; }
}
子類,Lion.java
public class Lion extends Animal {
public String noise = "ROAR!!";
public String toString() { return noise; }
}
的主類,Runner.java
public class Runner {
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a);
System.out.println(a.noise);
Lion b = new Lion();
System.out.println(b);
System.out.println(b.noise);
Animal c = new Lion();
System.out.println(c);
System.out.println(c.noise);
}
}
輸出結果爲:
squeak
squeak
ROAR!!
ROAR!!
ROAR!!
squeak
c.noise爲什麼會返回吱吱聲?實例方法調用和實例變量之間的區別是什麼,它會返回您期望的結果,而另一個則不會?爲什麼Java會這樣做?
感謝
我不是Java專業人員,所以我不會稱這爲答案,但區別在於Java中的方法是虛擬的。也就是說,當你調用c.toString()時,Java通過使用查找表知道使用正確的方法是Lion的toString()。但是,這種虛擬化不會發生在實例變量上。 – erisco