[英]Why constructors are called on the time of Object Creation?
這樣想吧...
如果您不想初始化變量,則可以聲明它:
MyObject myObject;
但是,如果您希望能夠使用myObject
進行任何操作,則需要創建一個變量可以指向的對象,並使用new
關鍵字完成此操作。 否則, myObject
只會指向大的空白。
多年以來,Java上游語言中的術語一直侵犯Java語言。
過去,(C)分配是與初始化分開的單獨步驟。 它們結合在C ++中,現在被認為是同一件事。 從技術上講,“構造”中的操作順序為
對於對象的父類,可以多次執行這些步驟。 關鍵是分配總是在初始化之前進行,並且兩者緊密耦合。 分配必須在初始化之前進行,否則初始化沒有內存可初始化。 構造函數保證兩者都可以避免在其他語言中出現較早的問題,因為在其他語言中程序可以通過訪問已分配但未初始化的項來訪問隨機數據。 創建構造函數以防止此類錯誤。
現在,您分配給它的東西是一個變量,變量保存對值的引用(在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.