![](/img/trans.png)
[英]The difference between passing interface reference and class reference in java
[英]Difference between wrapper class reference and user defines class reference in java
假設我有一個自定義類,例如Test。
Test test = new Test(); // test is the reference.
現在,當我打印test的值時,它將返回hashcode。
現在考慮,
Integer i = new Integer(10);
當我打印i
的值時,它返回10。
有人可以幫助我了解這里的區別是什么嗎? 我相信兩者都是對象引用,但是對於包裝類引用,它返回所指向的對象的值。
創建新類時,它將從Object
繼承方法toString()
。 Integer
類重寫該方法以返回內部值。
打印時,將隱式調用toString()方法。
默認情況下(在Test類中),它使用一個Object類內部。 對於Integer,它將Integer轉換為以10為基數的字符串。
您的Test類使用Object類的toString()方法,該方法打印hashCode。 但是對於Integer類,將重寫toString方法。 您可以在這里看到Integer.java
用戶定義的引用是一個對象,如果您打印該對象,則意味着您可能會得到一些哈希碼,因為每個類都擴展了Object類,因此您還具有tostring()屬性(方法)。
包裝器類包裝各自的原始數據類型Integer i = new Integer(10); 和i = 10; 兩者的價值相同。
當您調用System.out.println(Object)
(或更PrintStream.println(Object)
)時:
此方法首先調用String.valueOf(x)
如果參數為null,則字符串等於“ null”; 否則,返回
obj.toString()
的值。
您的兩個對象都不為null
,因此將調用實例的toString()
方法。
對於Integer
:
該值將轉換為帶符號的十進制表示形式並作為字符串返回
對於Test
,除非您已顯式重寫它(或超類已重寫它),否則將調用Object.toString()
:
[T]他的方法返回的字符串等於:
getClass().getName() + '@' + Integer.toHexString(hashCode())
如果這不是期望的行為,請在Test
重寫toString()
:
class Test {
@Override public String toString() {
// ... Your implementation.
}
}
每當您打印對象時,Java都會調用toString()
方法。 對象類中可用的toString()
的默認實現。 Object是Java中所有Object的基類。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
它將打印帶有完整包路徑@和對象的HashCode的類Name。
測試類不會覆蓋toString()
方法。 但是,java中的所有包裝器類都會覆蓋toString()
當您調用Integer方法時,它將調用在Integer類中實現的toString()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.