2017-04-17 63 views
0

我的網站上(http://www.rajeshpatkar.com/articles/javarefpnt/),該讀出時,我們實例化一個類即Java中的句柄的概念是什麼?

Emp e = new Emp(); 

甲句柄存儲在變量e,即它不對象的地址存儲在存儲器中,其不是指針。

該解釋給出了一個指針數組的例子。存儲器地址存儲在[1]位置,當對象移動時,該位置用新地址更新。

那麼爲什麼這個數組被用來代替直接存儲地址(它聲明它有助於GC,但我不理解它)並在對象移動時更新它(存儲在e中的地址)?

我花了相當多的時間來理解這一點,但仍然沒有找到滿足我的答案。 所以,如果你能解釋一下實際存儲在變量'e'中的東西(舉一個例子),它會很有幫助。

謝謝:)

回答

5

通常的術語是「對象引用」(或只是「參考」),而不是「處理」。

對象引用是一個不透明的值,它向JVM唯一標識某個對象。該值的形式不是由規範以外的規定。我懷疑它的尺寸通常是intlong,但我認爲即使這個尺寸不在JLSJVM規範中。 (爲了給你一個想法,JVM規範明確指出,即使確切的值爲null [特殊值的含義是「no reference」]不是強制性的。)

引用不是指針,雖然當然自從沒有指定引用的形式,只要不違反規範就可以利用指針作爲引用來實現JVM。

因爲引用不是指針,所以Java沒有像C和其相關語言那樣的「指針算術」。

所以,如果你能解釋一下實際存儲在變量'e'中的內容(舉例),這將很安靜。

它沒有被規範定義。它只是一個唯一標識對象的值(我們永遠無法看到該值;當您使用System.out來打印未實現toString的對象時,看到的十六進制值是對象的引用的神話就是:神話)。 該值如何標識該對象是由JVM的實現決定的。它可能是一個指針。它可能是一個指針數組的索引。它可能更復雜,使用參考值中的不同位來表示不同的事情。

+0

很好的解釋隊友。我終於理解了句柄的概念。繼續使用指針數組的例子,即'e'(引用變量)指向一個[1](依次[1])存儲對象的地址。另外我知道我們不能改變'e'的值,也就是說我們不能在e中指向[5]或java中的任何其他內存,只有內容即存儲在[1]中的值可以改變。這在Java中的原因是什麼,即爲什麼不允許將'e'指向java中的任何其他位置?允許它有什麼風險? –

+2

@JayeshSaita:很高興幫助。 *「...我進一步知道我們不能改變'e'的值......」是的,我們可以:'e = someOtherObject;'不要被JVM如何實現它。只是:變量存儲值。存儲在引用類型變量中的值是一個對象引用。該值告訴JVM對象在哪裏。 :-) –

1

句柄存儲在變量e中,該變量不是指針,即 不存儲對象在內存中的地址。

出於所有實際目的,您可以假定它將對象的地址存儲在內存中。

但是,在Java中考慮不能以明確的方式管理內存。這意味着你不能讓這種變量指向內存中的特定位置。你可以將這個變量指向特定的實例。

+0

*「爲了所有實際目的......」* - 除了壓縮的oops之外 - http://stackoverflow.com/questions/25120546/trick-behind-jvms-compressed-oops –

+0

確實,在64 bit JVM – Andres

+0

我想,並非所有的實際目的。有hashcode()通常通過將對象引用轉換爲整數來實現(儘管這不是必需的),對吧?相反,如果它依賴於內存中的指針,那麼即使對象沒有變異,此實例的每個GC移動都會使其返回不同的哈希碼。這違反了hashcode()的合同。 –