簡體   English   中英

構造函數鏈中的對象類型是什么?

[英]What will be the type of Object in Constructor chaining?

為什么這段代碼只返回類C的名稱。當我使用它時,它應該返回我正在使用它的構造函數的類的名稱。

class A{
     public A() {
         System.out.println(this.getClass().getName());
     }
}
class B extends A{
    public B() {
        System.out.println(this.getClass().getName());
    }
}
class C extends B{
     public C() {
         System.out.println(this.getClass().getName());
     }
}
class Main{
    public static void main(String[] args){
         new C();
    }
}

this.getClass().getName()返回this實例的運行時類型的名稱。 如果您創建C( new C() )的實例,它將始終返回“packagename.C”。 如果從C類代碼或C類超類中的代碼調用它並不重要。

一些相關點:

1)編譯器將在任何不包含對超類構造函數的顯式調用的構造函數中自動插入對無參數超類構造函數的調用。 (我鼓勵你在編寫代碼時選擇隱式行為的顯式行為,但這是一個有爭議的風格點)。 無論如何,編譯器的代碼如下:

class A{
    public A() {
        System.out.println(this.getClass().getName());
    }
}

class B extends A{
    public B() {
        super();
        System.out.println(this.getClass().getName());
    }
}

class C extends B{
    public C() {
        super();
        System.out.println(this.getClass().getName());
    }
}

class Main{
    public static void main(String[] args){
        new C();
    }
}

這清楚表明System.out.println被分三次調用。

2)在構造函數內部使用this來調用方法通常會導致非常奇怪的行為。 參見例如: this 那是因為初始化的工作原理如下:

1)調用C類構造函數。 此時,為C類對象分配內存,並且在VM內填充對象元數據,包括其實現的類,接口。 所有字段( 包括繼承的字段)都初始化為其默認值

2)調用B類構造函數。 在構造函數內部,它引用了類C的對象,但是在C構造函數中初始化的字段都不會被初始化。 這將立即調用A類構造函數。

3)運行A類構造函數。 初始化此構造函數中設置的字段。 構造函數執行方法和初始化並返回,堆棧傳遞回B構造函數。

4)B構造函數執行其方法並將控制權返回給C構造函數。

5)C構造函數返回。

所以現在我們了解會發生什么:這個鏈打印C三次。 我懷疑你想要寫的是:

    class A{
    public A() {
        System.out.println(A.class.getName());
    }
}

class B extends A{
    public B() {
        super();
        System.out.println(B.class.getName());
    }
}

class C extends B{
    public C() {
        super();
        System.out.println(C.class.getName());
    }
}

class Main{
    public static void main(String[] args){
        new C();
    }
}

這將打印出A,B,C。

首先,當調用new Child()時,由於Child類中沒有聲明的非參數構造函數,因此它將簡單地調用調用Parent構造函數的super()。

然后,當執行this.getClass()。getName()時,這里代表一個Child實例,這就是為什么你得到“Child”作為結果。 請記住,Object#getClass()返回對象所屬的最具體的類。 這里看到更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM