1. 程式人生 > >構造器和多態

構造器和多態

多態 rri clas 基本介紹 默認 tro 避免 未在 this

一.基本介紹

1.1構造器默認為static方法——static方法默認為final方法;
1.2基類構造器調用順序

檢查對象是否被爭取構造是構造器的一項任務。

1.1導出類會按照繼承層次逐漸向上調用基類構造器,1.2然後按照聲明順序調用成員初始化方法,1.3最後調用導出類構造器主體;

如果沒有明確調用(super關鍵字)哪個基類構造器,則默認調用(無參),若基類沒有默認構造器的話編譯報錯。示例如下:

//編譯失敗
class Grandfather{
    int tag=0;

    public Grandfather(int tag) {
        this.tag = tag;
    }
}

class
Father extends Grandfather{ public Father() { super(1);//去掉這一句,則默認調用基類無參構造函數,編譯失敗 System.out.println("father"); } }
//1.1導出類會按照繼承層次逐漸向上調用基類構造器,1.2然後按照聲明順序調用成員初始化方法,1.3最後調用導出類構造器主題;

class Grandfather{
    int tag=0;

    public Grandfather(int tag) {
        System.out.println("ground father"
); this.tag = tag; } } class Father extends Grandfather{ public Father() { super(1); System.out.println("father"); } } class Son extends Father{ public Son() { System.out.println("son"); } } public class Demo01 { public static void main(String[] args) { new
Son(); } } output: ground father father son
1.3構造器內部的多態方法的行為

多態方法即導出類重寫父類的方法:

  1. 如果這個方法在父類構造器中使用,則調用的是子類重寫後的方法;
  2. 假若這個方法調用了子類某個變量,則這個變量因為還未在導出類中用其初始化方法,此時分配給變量的存儲空間初始化成二進制的0;

示例如下:

class father{
    public father() {
        func();
    }

    void func(){ }
}

class son extends father{
    int tag=1;

    public son(int tag) {
        // System.out.println("tag = "+tag);這裏默認調用了父類的構造方法;
        this.tag = tag;
        System.out.println("tag = "+tag);
    }
    
    @Override
    void func() {
        System.out.println("tag = "+tag);
    }
}
public class Demo02 {
    public static void main(String[] args) {
        new son(1);
    }
}

output:
    tag = 0//分配給對象的存儲空間初始化為二進制的零;
    tag = 1

由上述可知初始化的實際順序為:

  1. 將分配給對象的存儲空間初始化為二進制的零;
  2. 調用基類構造器,構造函數中調用方法為覆蓋後的方法;
  3. 導出類中按照聲明順序調用成員的初始化方法;
  4. 調用導出類構造器主體;

[註]

  1. 導出類應該避免調用其他方法,或者調用基類中final方法——不能被改變的方法;
  2. 導出類能夠調用基類構造函數,但沒有繼承;

構造器和多態