簡體   English   中英

為什么在對象創建時調用構造函數?

[英]Why constructors are called on the time of Object Creation?

根據 ,構造函數實際上是初始化。 並根據答案對象在調用new關鍵字之后在構造函數之前已經創建。

所以我的問題是,如果我不想初始化任何東西,將構造函數放在new關鍵字之后的需求是什么。

這樣想吧...

  1. JVM為對象分配內存,但是尚未初始化或連接。
  2. JVM為內存中的對象分配通用的東西,例如指向方法的指針,靜態變量等。當對象存在時,仍然不能通過執行構造函數來唯一地初始化它。
  3. 調用構造函數,從而初始化對象。

如果您不想初始化變量,則可以聲明它:

MyObject myObject;

但是,如果您希望能夠使用myObject進行任何操作,則需要創建一個變量可以指向的對象,並使用new關鍵字完成此操作。 否則, myObject只會指向大的空白。

多年以來,Java上游語言中的術語一直侵犯Java語言。

過去,(C)分配是與初始化分開的單獨步驟。 它們結合在C ++中,現在被認為是同一件事。 從技術上講,“構造”中的操作順序為

  1. 為對象分配的內存
  2. 按指定初始化該內存。

對於對象的父類,可以多次執行這些步驟。 關鍵是分配總是在初始化之前進行,並且兩者緊密耦合。 分配必須在初始化之前進行,否則初始化沒有內存可初始化。 構造函數保證兩者都可以避免在其他語言中出現較早的問題,因為在其他語言中程序可以通過訪問已分配但未初始化的項來訪問隨機數據。 創建構造函數以防止此類錯誤。

現在,您分配給它的東西是一個變量,變量保存對值的引用(在Java中,對於對象)。 因此,您可以僅將變量視為可以取消引用值的名稱。 如果您想要一個新名稱,但又不想引用任何名稱,那么Keppil的答案是最好的。

MyType myName;

這將創建一個引用無值的名稱(空)。

但是,在Java中, 必須初始化對象值。 沒有“沒有初始化就分配”,因為這等同於具有隨機內部狀態的對象。 內部隨機狀態意味着使用該對象將(最好)具有隨機結果,並且(最壞)將引用不存在的對象。 在分配和初始化的構造緊密耦合的情況下,類型系統起作用; 沒有它,理論上您可以引用一個不存在的對象,從而在Java中重新創建C的分段錯誤。

您想初始化對象本身,包括為對象分配內存。 還有其他內部管理工作也需要完成。

引用您發布的鏈接:

構造函數的工作是確保新對象處於有效狀態...

您是否真的要創建一個對象而不使其處於有效狀態?

但是,如果您只想要對象引用,則只聲明一個,不要調用new。

MyClass mc;

沒錯,Java語法可能是

String str = new

代替

String str = new String()

給你一個空字符串。 問題是有時候我們想像這樣將參數傳遞給構造函數:

String str = new String("text")

這就是為什么我們調用構造函數的原因。 為了保持語法的一致性,還必須調用默認的構造函數String() 在這種情況下, String是一個不可變的類,因此沒有其他方法可以設置它的初始值。

暫無
暫無

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

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