2013-12-11 33 views
0

我正在嘗試做一些考試練習,並且需要一些幫助(我是否正確地做了它們?如果沒有,爲什麼?)關於這些關於java基元和java對象的問題。這些都是truefalseJava中的原語對象

  1. 以下變量聲明到其被動態分配和存儲在所述堆中的對象的引用:INT X = 7;

    ,因爲它是通由值,因爲int是原始

  2. 以下變量聲明到其被動態分配和存儲在所述堆中的對象的引用:整數x = 7;

    ,因爲它參照存儲在堆上

  3. 如果傳遞變量作爲(1)的方法,該變量是通過引用傳遞宣佈的「x」的對象,其值可能會被調用函數修改。

    ,因爲Java不僅通過值

  4. 如果傳遞變量「X」,如(2)的方法,在被創建 變量的副本宣通堆,並傳遞給該函數,以便該函數的對象 引用指向內存中的不同位置。

    ,因爲變量是在棧中,但它指向一個地方堆

謝謝大家的幫助。

+0

我不相信4) - IIRC,引用的副本放在堆棧上,儘管所提到的對象仍然在堆中。 –

+1

4)對我來說似乎是虛假的;通過參考副本,但該副本指向堆中的同一對象 –

+0

執行一些測試,在內部更改之前和之後打印值,您將得到答案。 – PSyLoCKe

回答

0

(4)爲假,原因有二:

  • 「在堆中被創建變量的副本」爲假。只有對象在堆上。函數中的局部變量不在堆上。該變量的值被簡單地傳遞,即被複制到被調用函數的棧幀中。
  • 「函數的對象引用指向內存中的一個不同的地方。」是錯誤的。該函數的引用將指向內存中的相同位置。這就是傳遞點 - 函數內部的變量值與傳遞的值相同。參考值就是它指向的地方。
1

4)如果傳遞的變量「X」如(2)一種方法,在該堆被創建,並且傳遞給函數變量的副本 , 以便函數的對象聲明引用指向內存中的一個不同的 位置。

好的,這可能有點粗略。如果處理對象,則不會創建對象的副本並將該副本傳遞給方法。您正在創建副本的參考到對象,並通過價值傳遞。

0

其實有一個原因2是錯誤的 - 但它可能不是設置它的人期望的原因。

Integer x = 7; 

將得到變成:

Integer x = Integer.valueOf(7); 

在-128這將重新使用的所有整數緩存值+127包容性。 (它也可以重用他們的其他值)。

因此,您將獲得對JVM實現相關緩存存儲中存在的常見Integer值的對象的引用。

+0

所以你認爲這個緩存不在堆上? – newacct

+0

它可能在堆上,但它肯定不會在堆上「動態分配」(至少取決於是否是緩存的惰性分配)。 –

+0

所以你說可以懶惰地分配對象。那麼如何分配它,如果不是動態的呢?從字面上看,該聲明表示「對象...是動態分配的」。它沒有說何時動態分配對象。 – newacct

0

因爲Integer是一個對象,所以是False。所以你只會傳遞函數中對象地址的引用。它在Java中是標準的。