Java之父類構造器

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Julin1214/article/details/51485488
當創建任何Java對象時,程序總會依次調用每個父類非靜態初始化塊/父類構造器執行初始化,最後調用本類的非靜態初始化塊/構造器執行初始化。
一  隱式調用和顯式調用

當調用某個類的構造器來創建Java對象時,系統總會調用父類的非靜態初始化塊進行初始化。這個調用是隱式執行,而且父類的靜態初始化塊總是會被執行。接着會調用父類的一個或多個構造器執行初始化,這個調用既可以通過super進行顯式調用,也可以是隱式調用。
當所有父類的非靜態初始化塊/構造器依次調用完成後,系統調用本類的非靜態初始化塊/構造器執行初始化,最後返回本類的實例。
(Java程序裏所有類的最終父類都是java.lang.Object類)

我們來看下面的例子:
public class Creater {
    {
        System.out.println("Creater的非靜態初始化塊");
    }
    public Creater(){
        System.out.println("Creater無參構造");
    }
    public Creater(String name){
        this();
        System.out.println("Creater帶有參數的name構造器"+name);
    }
}
/**
 * 子類
 */
public class Animal extends Creater {
    {
        System.out.println("Animal的非靜態初始化塊");
    }
    public Animal(String name){
        super(name);
        System.out.println("Animal的有參構造器"+name);
    }
    public Animal(String name,int age){
        this(name);
        System.out.println("Animal帶兩個參數的構造器"+name+age);
    }
}
/**
 * 繼承Animal的子類
 */
public class Wolf extends Animal {
    {
        System.out.println("Wolf的非靜態初始化塊");
    }
    public Wolf() {
        super("灰太狼",3);

        System.out.println("Wolf的無參構造器");

    }
    public Wolf(double weight){
       this();

        System.out.println("Wolf帶參的構造器"+weight);

    }
}
調用:

public class Test {
    public static  void main(String[] args){
     new Wolf(2.5);
    }
}


輸出結果:
Creater的非靜態初始化塊    
Creater無參構造                      (總父類初始化)
Creater帶有參數的name構造器灰太狼
Animal的非靜態初始化塊
Animal的有參構造器灰太狼<span style="white-space:pre">	</span>(wolf的父類初始化)
Animal帶兩個參數的構造器灰太狼3
Wolf的非靜態初始化塊
Wolf的無參構造器<span style="white-space:pre">		</span>(wolf初始化)
Wolf帶參的構造器2.5
只要在程序中創建Java對象,系統總是先調用最頂層的父類初始化操作,包括初始化塊和構造器,然後依次向下調用所有父類的初始化操作,最終執行本類的初始化操作返回本類的實例。
至於調用父類的哪個構造器執行初始化,則分爲如下幾種情況:
   1子類構造器執行體的第一行代碼使用super顯式調用父類的構造器,系統將根據super調用裏傳入的實參列表來確定調用父類的哪個構造器。
2子類構造器執行體的第一行代碼使用this顯式調用本類中重載的構造器,系統將根據this調用裏傳入的實參列表來確定本類的另一個構造器(執行本類中另一個構造器時即進入第一種情況)
3子類構造器執行提中既沒有super調用,也沒有this調用,系統將會在執行子類的構造器之前,隱式調用父類無參數構造器。

super調用用於顯式調用父類的構造器,this調用用於顯式調用本類中另一個重載的構造器。super和this調用都只能在構造器中使用,而super和this調用都必須作爲構造器的第一行代碼,因此構造器中的super調用和this調用最多隻能使用其中之一,而且最多隻能調用一次。    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章