的這個簡單的例子,請看看下面的代碼:混淆多態性
class Foo {
public int a;
public Foo() {
a = 3;
}
public void addFive() {
a += 5;
}
public int getA() {
System.out.println("we are here in base class!");
return a;
}
}
public class Polymorphism extends Foo{
public int a;
public Poylmorphism() {
a = 5;
}
public void addFive() {
System.out.println("we are here !" + a);
a += 5;
}
public int getA() {
System.out.println("we are here in sub class!");
return a;
}
public static void main(String [] main) {
Foo f = new Polymorphism();
f.addFive();
System.out.println(f.getA());
System.out.println(f.a);
}
}
在這裏,我們分配Polymorphism
類對象的引用Foo
型,經典polmorphism的變量。現在我們調用Polymorphism
中已被覆蓋的方法addFive
。然後我們從getter方法中打印變量值,該方法也已在類Polymorphism中被覆蓋。所以我們得到答案爲10.但是,當公開變量a
是SOP'ed我們得到答案3!
這是怎麼回事?儘管引用變量類型是Foo,但它指的是多態類的對象。那麼爲什麼訪問f.a
不會導致打印類Polymorphism
中的a值?請幫忙
ohh ..那麼你能不能解釋我爲什麼是這樣?我的意思是,如果變量也被覆蓋,那麼可能會產生什麼影響?因爲檢查對象類型,同時調用mmethods和檢查類的類型,同時讓字段聽起來很奇怪 – Shades88
我可以嘗試;)引用類型決定哪些方法和變量可用於調用。你用多態性做的是重寫這些可用方法的**行爲**。但是,由於您無法覆蓋類變量,您將始終在引用類型的類中獲取該變量的值。 – Tobb