簡體   English   中英

當我們在JAVA中創建構造函數時,是重載還是覆蓋?

[英]When we create a constructor in JAVA, is it overloaded or overridden?

在 Java 中,重載是創建具有相同名稱但不同簽名的方法,而覆蓋是創建具有相同名稱和相同簽名的方法。

那么,當我們在 JAVA 的子 class 中創建構造函數時,會發生什么,重載或覆蓋?

兩者都不。 構造函數不同於方法。 您通過在同一個 class 中而不是在繼承的類中編寫多個構造函數來重載構造函數。 並且構造函數不會被覆蓋。 如果我調用new X("Hi") ,我知道我調用的是在X中定義和實現的構造函數,而不是在X的某個子類中重寫的構造函數,或者從X的某個超類繼承的構造函數。

根據JLS §8.8

構造函數聲明不是成員。 它們永遠不會被繼承,因此不會被隱藏或覆蓋。

所以它不是壓倒一切的。 而且由於構造函數不是繼承的,所以當您在子類中聲明構造函數時,它也不會重載超類中的構造函數。 然而,它是:

  • 重載在同一 class 中聲明的其他構造函數,如果有的話,或者;
  • 如果之前沒有聲明構造函數,則替換默認構造函數。

class 由成員(字段或方法)和構造函數組成 - 作為完全不同的事物。 但是你想做一個概念上的比較。

class A {
    A() { }
}

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

在 JVM(java 虛擬機)內部,構造函數簽名是A.<init>()

B()在內部實現為:

int field1;
String field2;
String field3 = null;
int field4 = 42;

B() {
    // 1. Explicit or implicit super constructor:
    super(); // A.<init>();

    // 2. All fields with initialisation:
    field3 = null;
    field4 = 42;

    // 3. The remaining code:
    System.out.println("Bar");
}

這看起來像是覆蓋A.<init>() (雖然@Override是不允許的),但基本方法被隱式調用(無參數),或顯式調用super(...)

重載意味着在 B 中有超過 1 個構造函數。

暫無
暫無

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

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