2015-06-22 89 views
1

了計劃的範圍是:Java繼承和可變

class A 
{ 
    int i = 10; 
} 
class B extends A 
{ 
    int j = 20; 
} 
class C extends B 
{ 
    int k = 30; 
} 
class D extends C 
{ 
    int m = 40; 
} 

public class asg2 
{ 
    public static void main(String[] args) 
    { 
     A[] a = {new A(),new B(), new C(), new D()}; 

    System.out.println(a[3].i); //No error!!! 
    System.out.println(a[2].j); //throws error 
    System.out.println(a[1].k); //throws error (Understood why error) 
    System.out.println(a[0].m); //throws error (Understood why error) 
} 

}

我明白爲什麼最後兩個罰球錯誤。 但我不明白爲什麼第二個打印語句拋出錯誤。 第一個順利運行。

asg2.java:29: error: cannot find symbol   
System.out.println(a[2].j);          
        ^
symbol: variable j      
location: class A            

回答

5

編譯器不看到C類型的元件a[2]。它看到它的類型爲A,因爲這是聲明數組的類型。因此它不能接受訪問屬於A的子類的字段。如果你投的元素C,編譯會接受它:

System.out.println(((C) a[2]).j); // compiles OK 
2

您的陣列a中的每個條目是A類型。它實際上可能持有BCD的實例,但該變量的類型爲A,因爲這是您的數組被聲明的方式。所以你不能訪問A沒有的字段(除非你轉換爲另一種類型,明確地告訴編譯器你認爲對象是什麼類型)。