2012-07-23 175 views
0

根據this,構造函數實際上是初始值設定項。並且根據this答案對象已經在調用new關鍵字之後的構造函數之前創建。爲什麼在創建對象時調用構造函數?

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

+2

爲什麼你不想初始化你的對象? – 2012-07-23 16:36:17

+0

如果在創建對象時不想執行任何操作,則可以使用空的構造函數。你想要一個初始化對象是否有很好的理由? (順便說一句,你可以做到這一點,但我懷疑這不是你想要的) – 2012-07-23 16:44:07

+0

@codemaker:做任何答案都能解決你的問題嗎?如果不是,你能澄清你的問題嗎? – atk 2012-07-31 20:22:20

回答

5

把它看成是這樣的...

  1. 的JVM分配內存爲對象,但它尚未初始化或接線。
  2. JVM爲內存中的對象分配常用的東西,比如指向方法的指針,靜態變量等。雖然對象存在,但它仍然沒有通過執行構造函數來唯一地初始化。
  3. 調用構造函數,初始化對象。
4

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

MyObject myObject; 

不過,如果你希望能夠做任何事情都與myObject,你需要創建一個對象該變量可以指向,並且用new關鍵字完成。否則myObject只是指向一個什麼都沒有。

+2

那並不真正聲明一個對象。它聲明瞭一個最終將「包含」或「指向」指定類型的對象的變量。 – atk 2012-07-23 16:37:47

+0

@atk:我沒有說聲明一個對象,我說聲明一個變量。 – Keppil 2012-07-23 16:39:47

+0

你是對的。我期望這會混淆OP,因爲我認爲他們對於分配對象的時間和初始化時間之間的差異感到困惑,所以增加了說明。道歉沒有在我的意圖更清晰:) – atk 2012-07-23 16:43:48

0

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

0

引述您發佈的鏈接:

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

你真的想創建一個對象,並沒有在一個有效的狀態?

如果你只是想要一個對象引用,只需聲明一個,不要調用new。

MyClass mc; 
+0

你是什麼意思的「有效狀態」? – Parth 2012-07-23 17:02:32

0

你是對的,Java的語法可能是

​​

,而不是

String str = new String() 

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

String str = new String("text") 

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

+1

你也可以做'List list = new ArrayList()'。在你的例子中'List list = new'會不明確。 – 2012-07-23 17:54:40

+0

好點,我認爲這是他所要求的,不知道爲什麼頂部的答案在那裏... – 2012-07-23 17:59:01

1

多年來,Java上游語言的術語侵入了Java語言。

過去(C)分配是從初始化開始的單獨步驟。他們用C++結合起來,現在被認爲是同樣的事情。從技術上講,在「建造」操作的順序是

  1. 爲對象
  2. 分配的存儲器作爲指定初始化該內存。

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

現在,您分配給的東西是一個變量,並且變量保存對值的引用(在Java中,對於對象)。所以你可以考慮一個變量只是一個可以被解除引用的值。如果你想要一個新的名字,但希望沒有提及,那麼Keppil的答案是最好的。

MyType myName;

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

但是,在Java中,對象值必須被初始化。沒有「沒有初始化分配」,因爲這相當於擁有一個隨機內部狀態的對象。隨機內部狀態意味着使用該對象將具有(最好)隨機結果,並且(在最壞的情況下)對不存在的對象的引用。隨着分配和初始化建設的緊密結合,類型體系運作;如果沒有它,理論上可以引用一個不存在的對象,從而在Java中重新創建C的分段錯誤。

+0

:'MyType myName'引用'null',那麼M​​yType myName = new MyType()'將如何如果'MyType()'是一個默認構造函數,則初始化Object? – Parth 2012-07-23 16:59:04

+1

'new MyType()'是一組命令組合,用於分配必要的內存,根據構造函數指令初始化該內存,並返回一個引用。 'MyType myName'部分只是一個引用(就像一個指針),它沒有任何內存超過了引用的數量,而整個操作'MyType myName = new MyType()'構造了右邊的對象,然後將返回的引用分配到左側的「named」內存位置。它不是C++,因此如果沒有'new'關鍵字(沒有就地分配),就永遠不能創建對象。 – 2012-07-23 17:04:01

+0

就默認的構造函數而言,基本上所有的對象都帶有一個構造函數_if,只要你不聲明one_。如果你沒有聲明構造函數,編譯器會在'public MyType(){super(); '作爲構造函數。如果你聲明瞭一個構造函數,那麼不存在默認的構造函數。無論哪種情況,'new(插入構造函數)'從不會調用超出插入的構造函數,所以關於構造函數的唯一「默認」部分不會影響'new MyType()'部分(因爲它是顯式聲明的,所以不默認)。 – 2012-07-23 17:07:45

相關問題