簡體   English   中英

包裝類引用和用戶在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)

String.valueOf(Object)返回:

如果參數為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM