Java默認構造函數



Answers

如果您未在類中定義任何構造函數,則會創建一個默認構造函數。 它只是一個沒有參數的構造函數,它什麼都不做。 編輯:除了通話超()

public Module(){
}
Question

究竟是一個默認的構造函數 - 你能告訴我以下哪一個是默認構造函數,以及它與其他構造函數的區別?

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}



你好。 根據我的知識,讓我清除默認構造函數的概念:

編譯器自動為任何沒有構造函數的類提供一個無參數的默認構造函數。 這個默認構造函數將調用超類的無參構造函數。 在這種情況下,如果超類沒有無參數構造函數,編譯器會發出抱怨,因此您必須驗證它是否存在。 如果你的類沒有顯式超類,那麼它有一個隱式超類Object,它有一個無參構造函數。

我從Java教程中閱讀這些信息。




一般的術語是,如果你沒有在你的對像中提供任何構造函數,那麼將自動放置一個叫做默認構造函數的無參數構造函數。

如果你確實定義了一個構造函數,如果你沒有提供任何構造函數,它通常被稱為無參數構造函數。只是一個約定,儘管一些程序員喜歡將這個顯式定義的無參數構造函數作為默認構造函數來調用。 但是如果我們明確地定義一個,而不是默認的話。

根據文檔

如果一個類不包含構造函數聲明,那麼隱式聲明一個沒有形式參數且沒有throws子句的默認構造函數。

public class Dog
{
}

會自動修改(通過添加默認構造函數)如下

public class Dog{
    public Dog() {

    }
} 

當你創建它的對象

 Dog myDog = new Dog();

這個默認構造函數被調用。




默認構造函數指的是在沒有任何程序員定義的構造函數的情況下由編譯器自動生成的構造函數。

如果程序員沒有提供構造函數,編譯器會隱式聲明一個調用super()的默認構造函數,沒有throws子句,也沒有形式參數。

例如

class Klass {
      // Default Constructor gets generated
} 

new Klass();  // Correct
-------------------------------------

class KlassParameterized {

    KlassParameterized ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassParameterized(); //// Wrong  - you need to explicitly provide no-arg constructor. The compiler now never declares default one.


--------------------------------

class KlassCorrected {

    KlassCorrected (){    // No-arg Constructor
       /// Safe to Invoke
    }
    KlassCorrected ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassCorrected();    /// RIGHT  -- you can instantiate



當我們沒有明確定義一個類的構造函數時,java為這個類創建一個默認構造函數。 它本質上是一個非參數化的構造函數,即它不接受任何參數。

默認構造函數的工作是調用超類構造函數並初始化所有實例變量。 如果超類構造函數不存在,那麼它會自動將實例變量初始化為零。 因此,它的作用就是使用構造函數,即初始化對象的內部狀態,以便創建實例的代碼將具有完全初始化的可用對象。

一旦我們為類定義了我們自己的構造函數,就不再使用默認的構造函數。 所以,它們都不是默認的構造函數。




Links