2013-05-26 112 views
-4

對於參考變量,以下哪項爲真?打印參考變量不打印對象的地址

(ⅰ)打印參考將不打印由它稱爲對象 的地址

(ⅱ)打印參考將打印通過它稱爲對象 的地址

(III) &操作者不能對參考變量可以用來打印 其地址

(ⅳ)操作者&可以對參考變量被用來打印他們 地址

答案:根據我I和III

但參考是指向該對象的地址的指針。所以當它直接打印時,它應該打印該對象的地址,並且使用帶有參考變量的&將打印它自己的地址。

+6

那你試過了嗎?引用是「獲得對象的某種方式」 - 它不一定是一個原始指針。不,使用'&'與引用類型變量將無法編譯。在我看來,你可以自己很容易地驗證這兩個。 –

+0

我是新來的java和我正在應用c + +概念。 –

+0

@JonSkeet我可以將對象的地址存儲在除引用之外的其他變量中嗎?如果沒有,那麼它應該是一個原始指針 –

回答

2

所以,你似乎不同意這個多選答案的給定答案。試想一下:

String s = "Hello world."; 
System.out.println(s); 

sString類型,這是一類,它是Java中的引用類型。然而,當您打印s時,您會得到打印的字符串,而不是地址。所以,(i)是真實的而不是(ii)。

關於&運營商,有些事情您需要了解。

  • 首先,引用對象並不意味着指向對象的指針。它可能(在理論上)是一個雙指針,它可能是一個帶有偏移量的三重指針,或其他任何東西,只要它通過一些特定的約定來引用對象。當然,最簡單的慣例是直接指向對象的指針,但Java語言並不打算拼出來(據我所知),因爲它是一種實現。
  • Java是與C和C++不同的語言,所以它爲操作符定義了它自己的語義。因此,簡單地說,在Java中,&不是「操作符的地址」,因爲語言設計者已經這樣定義它。無論是否將引用實現爲簡單指針,都不存在「地址」操作符。背後的哲學當然是避免指針算術和內存安全。

所以,它是(iii)而不是(iv)。

+0

非常感謝。這是非常詳細闡述。 現在你已經提出了一個更多的懷疑,這個雙指針和三指針是什麼,你說它也可能是雙指針或三指針。這是否意味着它應該是一個指針? –

+0

@rakeshkumar他們只是其中的一些例子,理論上它可能是。在Java實踐中,它們絕對不是**。 –

+0

好的。不管怎麼說,還是要謝謝你... –

3

當您使用System.out.print()打印對象引用。它在內部使用String.valueOf(object)來打印對象。 String.valueOf(object)內部調用object.toString()方法將調用Object類中定義的toString()的默認實現,如果您尚未覆蓋班級中的toString()

作爲每的Javadoc,

Object類的toString方法返回一個由其中的對象是一個實例,該符號字符'@」的類的名稱的字符串,並且無符號對象的哈希碼的十六進制表示。

現在,如果你考慮的Javadoc hashCode(),它說

儘可能多是合理可行的,由Object類定義的hashCode方法不會返回不同的整數針對不同的對象。 (這一般是通過將該對象的內部地址轉換成一個整數來實現,而不是由的JavaTM編程語言不需要這種實現技巧。

因此,你實際上不打印對象的地址引用。

其次,&只是一個按位AND運算符。它和它操作的兩個操作數的各個位有關。您不能在單個對象引用變量上使用它。請參閱Java tutorials以瞭解有關使用&運算符的更多信息。