2016-08-20 49 views
17
RealEstate v = new RealEstate(); 

我已將此new關鍵字與RealEstate()結合使用。我知道new分配內存並使用RealEstate類構造函數初始化內存。當'new'操作符使用構造函數初始化內存時,JVM會做什麼?

什麼是JVM在這裏做什麼?

+6

我不覺得這個問題應該有6個downvotes,最有可能downvoters不明白什麼OP是真的問。希望有6個用戶爭取對付這些降價。 –

+0

是啊@ Jean-FrançoisSavard –

+0

你的問題包含自己的答案。不清楚你在問什麼。 – EJP

回答

13

new運算符實際上並未使用構造函數的幫助來分配內存。它與構造函數無關。 Basically Java's version of malloc is new.

new操作者:

  • 分配內存爲對象
  • 所調用對象構造
  • 返回參照該存儲器

構造被單獨執行的初始化期間執行的任何操作,比如將值分配給對象和變量。如果沒有構造被定義,則編譯器將創建默認的構造,並且將分配的默認值:


下表總結了幾種數據類型的默認值。 source

Data Type Default Value (for fields) 
byte   0 
short   0 
int    0 
long   0L 
float   0.0f 
double   0.0d 
char   '\u0000' 
String   null 
any object  null 
boolean   false 

所以,new運營商只分配內存,返回引用該內存。

documentation

新操作者通過對一個新的物體分配存儲器並返回到該存儲器中的參考實例的類。新的操作符也調用對象構造函數。

+8

不,Java不會爲每個對象使用malloc。實際上,通過在稱爲TLAB(線程本地分配緩衝區)的區域中增加一個指針,實際上會少得多。接下來會發生什麼是在Java語言規範中指定的,這包括運行類層次結構的初始化程序和構造程序。在此之前,對象的實體類也是構建和創建的。 https://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 – eckes

+1

它分配內存* first *,然後調用構造函數,然後返回引用。默認的構造函數是由編譯器創建的,而不是JVM。您已經省略了整數字段的默認值,並且不需要爲'String'給出默認值,這只是另一個對象。引用的語句來自Java教程,而不是「文檔」。 Java語言規範引用了正確的東西。 – EJP

+0

@EJP我只想指出在初始化期間執行的主要操作。這不應該是它們執行的確切順序。無論如何,感謝通知,我已經相應地更新了我的答案。就*默認值圖表摘要*而言,它知道這不是任何正確的文檔,但畢竟它仍然來自[oracle](http://docs.oracle.com/javase/tutorial/java /nutsandbolts/datatypes.html)。所以我認爲它可以被信任。 –