2016-02-11 187 views
2

我不知道發生了什麼事在這裏:的Java抽象類的構造函數

我有抽象超

public abstract class Superclass { 
    public Superclass() 
    { 
     doSth(); 
    } 
    public abstract void doSth(); 
} 

和子

public class Subclass extends Superclass{ 
    private int x = 10; 
    public void doSth() 
    { 
     System.out.println("Value x="+this.x);   
    }  
} 

當我做

Subclass x= new Subclass(); 
x.doSth(); 

我得到:

Value x=0 
Value x=10 

我不知道爲什麼首先得到x = 0(爲什麼不從x = 10開始?)然後x = 10?

回答

7

超級類的構造函數在子類的isntance初始值設定項表達式之前執行,這就是爲什麼x在第一次調用doSth()時仍具有默認值0的原因。第二個調用x.doSth()發生在Subclass實例完全初始化之後,因此x包含10

更多細節:

當你調用Subclass的constrcutor,首先它調用的Superclass它調用的Object構造函數的構造函數。然後執行構造函數Superclass的主體,所以執行doSth()。只有在Superclass構造函數完成之後,實例初始化表達式Subclass(在你的情況下,賦值爲)在評估之前,x仍包含默認值 - 0,這是您首次打印時看到的值到doSth()