簡體   English   中英

為什么默認構造函數需要在實例化Object時在具有Parameterized Constructor的POJO文件中聲明?

[英]Why Default constructor need to declare in POJO file which has Parameterized Constructor while instantiating Object?

假設我有一個POJO類User,其中包含一個constuctor public User(int id, String name){...} 但是當我實例化User對象之類的User u=new User()時沒有參數Eclipse會給出錯誤,如構造函數User()未定義 但是當我沒有參數化的構造函數時,它工作正常。 有人可以解釋為什么它需要定義默認構造函數?

如果您未提供其他構造函數,則僅提供默認(無參數)構造函數。 如果為類定義了一個構造函數,則必須使用顯式定義的(即在代碼中)構造函數之一來實例化對象。 當然,您可以定義自己的零參數空構造函數,如果它適用於您要執行的操作。

編輯:回答why?

編譯器提供默認構造函數,以便在沒有定義構造函數時可以實例化Object。 但是,如果您已經定義了參數化構造函數,則意味着當您創建該類的新實例時,其變量應使用您傳遞的參數進行初始化(或執行類似的操作)。 如果沒有這些初始化,對象可能不會以預期的方式運行。 因此,編譯器通過不定義默認構造函數(當您定義了默認構造函數時)來防止發生這種情況。

如果開發人員沒有提供構造函數,編譯器將自動添加no-arg構造函數。 但是,只要您放置自己的自定義參數化構造函數,編譯器就會停止為您添加默認構造函數。

在這種情況下,如果您仍想使用no-arg構造函數,則必須自己提供它:

public User() {
}

public User(int id, String name) {
}

這背后的邏輯是:如果定義自己的參數化構造函數,則聲明構造函數中列出的參數是構造類的對象所必需的。 因此,如果庫的用戶不提供這兩個參數,您也可以隱式聲明,該對象不應該構造。 因此編譯器不會為您添加no-arg構造函數。

如果你想聲明你的類仍然可以工作,如果參數化構造函數中沒有提供任何指定的參數而你(沒有arg),那么你可以通過自己提供非arg構造函數來明確聲明它。

我這么晚才回答,但讓我們試着和你分享我所知道的:

  1. 當你不提供構造函數編譯器提供構造函數時。 為什么? 因為您確定要僅使用參數構造函數初始化對象。 所以編譯器會為你做。
  2. 當您提供參數化構造函數時,編譯器不知道您將使用哪個構造函數來初始化對象。 所以編譯器沒有為你提供一個無參構造函數。 所以你必須明確寫。

    希望它會對你有所幫助。

Java編譯器自動為沒有構造函數的任何類提供無參數的默認構造函數。 如果您的類中沒有定義構造函數,那么Java編譯器將在生成的類文件中添加無參數構造函數。 但是如果你的類中有一個帶參數的構造函數,那么你需要編寫無參數構造函數,編譯器不會添加它。

編譯器自動為沒有構造函數的任何類提供無參數的默認構造函數,但如果您明確地為任何構造函數提供參數,那么編譯器將不會提供默認構造函數,主要是出於安全原因。

所以你能做的就是

 public User(int id, String name){...}
 public User(){this(defualtID,defaultName)};

暫無
暫無

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

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