10. JavaSE-子類實例化過程 & 構造方法間調用

子類的實例化過程:

    子類中所有的構造函數默認都會訪問父類中空參數的構造函數。

     class Parent

     {

        Parent(){

            System.out.println("parent class run");

        }

     }

     class Children extends Parent

     {

        Children(){

            //super();//調用的就是父類空參數的構造函數

            System.out.println("children class run");

            //return;

            /*說明:此處被註釋掉的super和return都是默認就有的語句。*/

        }

     }

 

     class  DemoChildren

     {

        public static void main(String[] args) 

        {

            System.out.println("Hello World!");

        }

     }

 

爲什麼子類實例化的時候要訪問父類構造函數?

    因爲子類繼承父類,獲取到了父類中內容(屬性),所以在使用父類內容之前,要先看父類是如

    何對自己的內容進行初始化的。所以子類在構造對象時,必須訪問父類中的構造函數。爲了完成

    這個必須得動作,就在子類的構造函數中加入super()語句。如果父類中沒有定義空參數的構造函

    數,那麼子類的構造函數必須用super明確調用父類中的哪個構造函數。同時子類構造函數中如果

    使用this調用了本類構造函數時,那麼super就沒有了,因爲superthis都只能定義在第一行,所以

    只能有一個,但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造方法。


    注意:super語句必須要定義在子類構造函數的第一行,因爲父類的初始化動作要先完成。

 

Java中,所有的類都是Object的子類。Object是最頂層的類,也就是Java中的God。

 

一個對象的實例化過程:

1. JVM讀取指定路徑下的.class文件,並加載進內存,並會先加載父類(如果有直接父類的情況下)

2. 在堆內存中開闢空間,分配地址

3. 並在對象空間中,對對象中的屬性進行默認初始化

4. 調用對應的構造函數進行初始化

5. 在構造函數中,第一行會先調用父類中的構造函數進行初始化

6. 父類初始化完畢後,在對子類的屬性進行顯示初始化

7. 在進行子類構造函數的特定初始化

8. 初始化完畢後,將地址賦值給引用變量

 

    注意:通過super初始化父類內容時,子類的成員變量並未顯式初始化,等super()父類初始化完

          畢後,才進行子類的成員變量顯示初始化。


構造函數之間互相調用:

    類中構造函數之間可以相互調用。

     class Parent

     {

        Parent(){

            System.out.println("parent class run");

        }

     }

     class Children extends Parent

     {

        Children(){

            this(20);

            System.out.println("children class run");

        }

        Children(int age){

            System.out.println("This boy age is "+age);

        }

     }

 

     class  DemoChildren

     {

        public static void main(String[] args) 

        {

            new Children();

           // System.out.println("Hello World!");

        }

     }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章