2013-08-04 61 views
1

按照這個答案hereJava基元可以被認爲是輕的對象

java對象和原語都堆在堆上。所以從JVM的角度來看,對象和基元類似,除了它們在堆上佔用更多空間之外?從本質上講,原始物只不過是「光」物?

+3

即使在JVM級別,原始對象也不是對象。 –

回答

7

Java基元不是「輕對象」。他們是原始人。他們在兩個非常重要的方面作爲對象失敗:他們不能進入對象,他們沒有方法。

除了作爲實際Java對象的字段之外,它們也不會堆在堆上。你不能做new int。還要注意的是,當你聲明一個基本類型的局部變量時,變量就會存在。當你聲明一個對象類型的局部變量時,你得到的只是一個對象的引用,但它被設置爲null,並且聲明類型的對象不是通過簡單地聲明該變量來分配的。

請注意,autoboxing有些模糊的區別,但區別肯定存在。

+0

「除了作爲實際Java對象的字段之外,不要堆在堆上」。即使這樣,人們可能會爭辯說它們不會堆積如山,它們只是表示對象的結構的一部分(恰好在堆中)。 – Thilo

+0

@Thilo - 我試圖說,一個Java原語(孤立地)不能從堆中分配,同時也試圖避免提示一個對象的原始字段以某種方式從不同於對象本身的內存中分配(當對象被分配)。 –

+2

這是一個很好的短語:原始字段存儲爲其包含的對象的一部分。無論是否在堆上(在當前的Java中它總是碰巧)或不是非重要的。與對象字段相反,只有引用被存儲爲對象的一部分,並且內容被分別分配。 – Thilo

1

這裏有點混亂。你在你的問題中鏈接到的問題說,原始內容裏面的一個對象可以在堆中。基元不能獨自堆在一起。

您不能像對象那樣引用int,它們可以直接訪問而不被「取消引用」。

1

您正在推斷原語可能進入堆中(作爲其他對象的一部分)以得出它們可能是輕量級對象的事實。一組基元組成了一個對象的狀態。它們本身不是物體。

原始人只是有一個價值。他們沒有像Objects那樣的狀態和行爲。他們沒有表現出繼承,多態性等。他們不像實體一樣行爲,但像他們的屬性。

+2

原語的確有一個狀態:它的當前值。 –

+0

@TedHopp,那裏的學位有所不同。人們很難說,「當環路退出時,我的狀態如何?」或者「申請價值已經腐敗」。它們不可互換,語義不同。 –

+0

我認爲根本不存在任何語義差異。畢竟,對象的狀態只不過是其字段的當前值(狀態)的集合。 (這包括所有被引用對象的狀態,可以辯論是否包含「瞬態」字段,但原理是相同的。)原始字段當然可以處於損壞狀態。如果代碼處於中間,例如交換字節,同時也做其他工作,並被中斷(例如,由異常),則可以合理地說該原語處於損壞狀態。 –

相關問題