2017-08-16 81 views
8

請看看這段代碼:爪哇 - 擴展爲什麼超變量是0

class Sup { 
    int a = 8; 

    public void printA() { 
     System.out.println(a); 
    } 

    Sup() { 
     printA(); 
    } 
} 

public class Sub extends Sup { 
    int a = 9; 

    @Override 
    public void printA() { 
     System.out.println(a); 
    } 

    Sub() { 
     printA(); 
    } 

    public static void main(String[] args) { 
     Sub sub = new Sub(); 
    } 
} 

結果: 控制檯打印:0 9
我知道,子類將首先調用父constructor
但是,爲什麼是0 9,而不是8 9

+0

您確定按照您認爲的順序調用構造函數嗎? –

+4

@ cricket_007:當然這是所謂的。你**不能**避免在Java中調用它。 –

+0

@ T.J.Crowder您可以通過使用序列化或克隆來避免它。 – Flown

回答

14

Sup構造函數調用printA()它執行Sub類的printA方法(它覆蓋類Sup的相同名稱的方法),所以它返回a可變Sub類的,這仍然是0的值,因爲Sub的實例變量尚未初始化(它們只在Sup構造函數完成後才初始化)。

+2

這也是爲什麼一些代碼標準要求在構造函數中調用的所有方法都是「final」或「private」的原因。防止覆蓋導致這些情況。 – Kiskae