根據this,構造函數實際上是初始值設定項。並且根據this答案對象已經在調用new
關鍵字之後的構造函數之前創建。爲什麼在創建對象時調用構造函數?
所以我的問題是如果我不想初始化任何東西,需要將構造函數放在new
關鍵字後面。
根據this,構造函數實際上是初始值設定項。並且根據this答案對象已經在調用new
關鍵字之後的構造函數之前創建。爲什麼在創建對象時調用構造函數?
所以我的問題是如果我不想初始化任何東西,需要將構造函數放在new
關鍵字後面。
把它看成是這樣的...
如果您不想初始化變量,你可以將它聲明:
MyObject myObject;
不過,如果你希望能夠做任何事情都與myObject
,你需要創建一個對象該變量可以指向,並且用new
關鍵字完成。否則myObject
只是指向一個什麼都沒有。
您想要初始化對象本身,其中包括爲對象分配內存。還有其他的內務管理內部工作也需要完成。
引述您發佈的鏈接:
構造函數的工作是確保新的對象處於有效狀態...
你真的想創建一個對象,並沒有在一個有效的狀態?
如果你只是想要一個對象引用,只需聲明一個,不要調用new。
MyClass mc;
你是什麼意思的「有效狀態」? – Parth 2012-07-23 17:02:32
你是對的,Java的語法可能是
,而不是
String str = new String()
給你一個空字符串。這個問題有時候我們想把參數傳遞到像這樣的構造函數中:
String str = new String("text")
這就是我們稱之爲構造函數的原因。爲了保持語法一致,你還必須調用默認的構造函數String()
。在這種情況下,String
是不可變的類,所以沒有其他方法來設置它的初始值。
你也可以做'List list = new ArrayList()'。在你的例子中'List list = new'會不明確。 – 2012-07-23 17:54:40
好點,我認爲這是他所要求的,不知道爲什麼頂部的答案在那裏... – 2012-07-23 17:59:01
多年來,Java上游語言的術語侵入了Java語言。
過去(C)分配是從初始化開始的單獨步驟。他們用C++結合起來,現在被認爲是同樣的事情。從技術上講,在「建造」操作的順序是
對於對象的父類,可能會多次執行這些步驟。關鍵在於分配始終在初始化之前,並且兩者緊密耦合。分配必須在初始化之前進行,或者初始化沒有內存進行初始化。構造函數保證兩者都是爲了避免其他語言中的早期問題,程序通過訪問已分配但未初始化的項目來訪問隨機數據。創建構造函數是爲了防止此類錯誤。
現在,您分配給的東西是一個變量,並且變量保存對值的引用(在Java中,對於對象)。所以你可以考慮一個變量只是一個可以被解除引用的值。如果你想要一個新的名字,但希望沒有提及,那麼Keppil的答案是最好的。
MyType myName;
這將創建一個沒有值(空)引用的名稱。
但是,在Java中,對象值必須被初始化。沒有「沒有初始化分配」,因爲這相當於擁有一個隨機內部狀態的對象。隨機內部狀態意味着使用該對象將具有(最好)隨機結果,並且(在最壞的情況下)對不存在的對象的引用。隨着分配和初始化建設的緊密結合,類型體系運作;如果沒有它,理論上可以引用一個不存在的對象,從而在Java中重新創建C的分段錯誤。
:'MyType myName'引用'null',那麼MyType myName = new MyType()'將如何如果'MyType()'是一個默認構造函數,則初始化Object? – Parth 2012-07-23 16:59:04
'new MyType()'是一組命令組合,用於分配必要的內存,根據構造函數指令初始化該內存,並返回一個引用。 'MyType myName'部分只是一個引用(就像一個指針),它沒有任何內存超過了引用的數量,而整個操作'MyType myName = new MyType()'構造了右邊的對象,然後將返回的引用分配到左側的「named」內存位置。它不是C++,因此如果沒有'new'關鍵字(沒有就地分配),就永遠不能創建對象。 – 2012-07-23 17:04:01
就默認的構造函數而言,基本上所有的對象都帶有一個構造函數_if,只要你不聲明one_。如果你沒有聲明構造函數,編譯器會在'public MyType(){super(); '作爲構造函數。如果你聲明瞭一個構造函數,那麼不存在默認的構造函數。無論哪種情況,'new(插入構造函數)'從不會調用超出插入的構造函數,所以關於構造函數的唯一「默認」部分不會影響'new MyType()'部分(因爲它是顯式聲明的,所以不默認)。 – 2012-07-23 17:07:45
爲什麼你不想初始化你的對象? – 2012-07-23 16:36:17
如果在創建對象時不想執行任何操作,則可以使用空的構造函數。你想要一個初始化對象是否有很好的理由? (順便說一句,你可以做到這一點,但我懷疑這不是你想要的) – 2012-07-23 16:44:07
@codemaker:做任何答案都能解決你的問題嗎?如果不是,你能澄清你的問題嗎? – atk 2012-07-31 20:22:20