2010-09-28 44 views
6
class A { public static void main(String[] args) 
{ A a = new A(); 
    B b = new B(); 
    A ab = new B(); 
    System.out.format("%d %d %d %d %d %d", a.x, b.x, ab.x, a.y, b.y, ab.y); } 
    int x = 2; 
    int y = 3; 
    A(int x) { this.x = x; } 
    A() { this(7); } } 

class B extends A { 
    int y = 4; 
    B() { super(6); 
    } 

嘿,我只是希望通過從我的過程中的一些例子,碰到這個問題難倒我來了。
我意識到 此代碼應打印出 「7 6 6 3 4 3」真正VS表觀Java中的類

但爲什麼ab.y等於3?不是B類的「真實」類型的對象ab? 那麼這會導致我相信ab.y是4?

回答

8

因爲您直接訪問字段,而不是通過getter方法。

您不能覆蓋字段,只能使用方法

類別B除父級A之外還有一個字段y。這兩個字段不會互相干擾,哪一個字段會在編譯時確定(通過編譯器已知的類型)。

如果你說

A ab = new B(); 

然後

ab.y 

將被編譯到看看A類聲明的字段y。這不會在運行時分派給實際的實例類。這與靜態方法是一樣的。

如果你

B ab = new B(); 

然後你在B類領域。

+0

好吧,清除它很多,謝謝! – 2010-09-28 02:02:40