java對象初始化

問題:

public class Parent
    public void test()
    {
    }
 
    public Parent()
    {
        test();
    }
 
    public static void main(String[] args)
    {
        new Child();
    }
}
 
class Child extends Parent
{
    private int instanceValue = 20;
    public void test()
    {
        System.out.println("instance value is: " + instanceValue);
    }
}
各位先猜猜打印的結果是多少呢?爲什麼呢?
----------------------------------------------------------------
答案:下面是摘自本人編寫的《Java就業培訓教程》中的一段講述,請大家注意第(4)步和第(5)步的講解,調用完父類的構造方法後,接着才進行成員變量的顯式初始化操作,上面代碼中的private int instanceValue = 20;定義應看成兩部分:第一部分是定義變量,第二部分是給變量賦值,變量定義位於父類構造方法之前,變量賦值位於父類構造方法之後。在父類的構造方法執行時,根據多態性,它會去調用子類中定義的test()方法,可是,這時候,子類中的成員變量還沒執行顯式初始化操作, 對於private int instanceValue = 20;定義,instanceValue 的值爲默認的初始化值0,所以,這時候在test方法中打印出的值爲0。
 
4.1.3子類對象的實例化過程
對於許多Java老手來說,子類對象的實例化過程也不見得非常清楚,你可能並不需要完全瞭解子類對象的實例化過程,但瞭解後還是有好處的。
對象中的成員變量的初始化是按下述步驟進行的:
1)分配成員變量的存儲空間並進行默認的初始化,就是用new關鍵字產生對象後,對類中的成員變量按第三章的表3.1中的對應關係對對象中的成員變量進行初始化賦值。
2)綁定構造方法參數,就是new Person(實際參數列表)中所傳遞進的參數賦值給構造方法中的形式參數變量。
3)如有this()調用,則調用相應的重載構造方法(被調用的重載構造方法又從步驟2開始執行這些流程),被調用的重載構造方法的執行流程結束後,回到當前構造方法,當前構造方法直接跳轉到步驟(6)執行。(反正要去調用父類的構造函數,如果調用this,那麼this指向的構造函數就會去調用父類的構造函數,我這個構造函數本身就不用再調用父類的構造函數了,如果沒有調用this,那我這個構造函數就必須去調用父類的構造函數)
4)如有沒有this()調用,顯式或隱式追溯調用父類的構造方法(一直到Object類爲止,Object是所有Java類的最頂層父類,/*在本章後面部分有詳細講解*/),父類的構造方法又從步驟2開始對父類執行這些流程,父類的構造方法的執行流程結束後,回到當前構造方法,當前構造方法繼續往下執行。
5)進行成員變量的顯式初始化操作,也就是執行在定義成員變量時就對其進行賦值的語句,如:
public Student extends Person
{
    String school = ”it315”;// 顯式初始化
    ……
}
將“it315”賦值給school成員變量。
6)執行當前構造方法的方法體中的程序代碼,如:
public Student extends Person
{
      public Student(String name,int age,String school)
      {  
          super(name,age);
          this.school = school;
      }
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章