簡體   English   中英

我想在多級繼承中僅調用子類構造函數嗎?

[英]I want to call only child class constructor in multilevel inheritance?

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

class B extends A {
    public B() {
        System.out.println("Constructor B");
    }
}

class C extends B {
    public C() {
        System.out.println("Constructor C");
    }

    public static void main(String[] args) {
        C c = new C();
    }
}

運行代碼時,它將調用所有構造函數,但僅需要調用子構造函數。

輸出僅打印

Constructor C

就像評論和已經回答的其他答案一樣, 這顯然是不可能的

如果一個類( Foo類)擴展了另一個類( Bar類),則Foo所有構造函數都必須直接或間接調用Bar的構造函數之一。 這可以通過顯式調用或隱式調用來完成。

class Foo {

    // No constructor is specified, so a default, empty constructor is generated:
    // Foo() { }

}
class Bar extends Foo {

    Bar() {
        // Explicit call to a constructor of the super class is omitted, so a
        // default one (to Foo()) is generated:
        // super();
    }

}

Java語言規范§12.5中 ,寫了如何創建新實例。 對於除Object以外的任何類,始終會執行超級構造函數。

  1. 此構造函數並不以對同一類中的另一個構造函數的顯式構造函數調用(使用此函數)開頭。 如果此構造函數用於Object以外的其他類,則此構造函數將以顯式或隱式調用超類構造函數(使用super)開始。 使用這五個相同的步驟,遞歸評估超類構造函數調用的參數和過程。 如果該構造函數調用突然完成,則出於相同原因,此過程也會突然完成。 否則,請繼續執行步驟4。

因此, 總是會調用super構造函數。 如果只想打印“構造函數C”,則需要執行以下任一操作:

  • 更改B的構造函數,以使它不再通過刪除println語句或一起刪除所有無參數的構造函數來打印“構造函數B”。
  • B添加第二個構造函數,該構造函數不打印任何內容,並從C調用它:

     B(boolean b) { } 
     C() { super(true); } 
  • 確保C不再擴展B

     class C { public C() { System.out.println("Constructor C"); } } 

不,你不能這樣做。 Java將根據層次結構調用所有構造函數。

暫無
暫無

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

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