前言
我們在進行 Java 編程時,經常要列印物件,有的是查看是否拿到了該物件,有的是查看該物件中的資料,列印輸出的卻是一知半解的字串,那么這個字串是怎么來的?代表什么?我們如何列印出物件中的資料呢?
一、Java中列印物件
1.演示代碼
我們使用 Java 的 System.out 類可以列印輸出物件,例如我們有一個 Student 類,有三個成員變數,一個有參構造方法,它的代碼如下:
點擊查看代碼
public class Student {
private String name;
private String sex;
private Integer age;
public Student(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
}
然后我們新建測驗類,創建 Student 物件,并直接使用 System.out.println 陳述句進行列印,
點擊查看代碼
public class Test {
public static void main(String[] args) {
Student student = new Student("張三", "男", 16);
System.out.println(student);
}
}
執行結果如下:
點擊查看代碼
com.example.Student@2f4d3709
2.提出問題
通過演示代碼運行結果可以看到列印輸出的是當前包下的類名,還有@字符,還有一串數字和字母,列印出類名很好理解,但是@、數字、字母是什么意思呀?應該很多同學都不是很明白吧,
二、深入分析
1.列印的字串是什么
當我們在 Java 中使用 System.out.println 或者其他輸出陳述句時,如果傳入的引數不是字串型別的資料,那么程式會自動呼叫該資料所屬類的 toString() 方法,目前 Student 類中并沒有 toString() 方法呀,是所有 Java 類都直接或間接繼承了 Object 類,而 Object 類中有一個默認的 toString() 方法,代碼如下:
點擊查看代碼
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
該方法官方注釋如下:
該方法回傳物件的字串表示形式,一般來說,toString 方法回傳一個“文本表示”此物件的字串,結果應該是一個簡潔但資訊豐富的表示,便于人們閱讀,建議所有子類重寫此方法,
Object 類的 toString 方法回傳一個字串,該字串由該物件作為其實體的類的名稱、@符號字符’ @'以及該物件哈希碼的無符號十六進制表示形式組成,換句話說,這個方法回傳的字串等于的值:getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
也就是我們的 Student 沒有重寫 toString() 方法,而是自動呼叫了 Object 類中的 toString() 方法,這時候我們列印輸出的是一個字串,其中包含物件的類名和哈希碼,
2.是物件的地址嗎?
有時候我們總是說列印了該物件的地址,其實是不準確的,列印的內容一個是類名,一個是哈希碼,列印的物件的哈希碼并不是參考地址,盡管在某些情況下它們可能看起來像是一樣的,
哈希碼是一個整數,它是由Java運行時環境根據物件的內部狀態計算出來的,對于一個類的任何兩個不同的實體,它們的哈希碼通常不會相同,也就是說,如果在列印一個物件時,看到了兩個不同的哈希碼,可以確定這兩個物件是不同的,它們占用不同的記憶體空間,
而參考地址是記憶體中的一個地址值,它表示某個物件在記憶體中的位置,對于同一個物件,無論它被參考多少次,它的參考地址始終是相同的,兩個不同的物件的參考地址也是不同的,
通常情況下,列印一個 Java 物件時顯示的是該物件的字串表示,這個字串既包括了實體的哈希碼,也包括了它的一些其他資訊,因此,在某些情況下,列印出來的哈希碼和參考地址可能看起來相同,但實際上它們是不同的概念,
三、列印物件內部資訊
如何列印物件內部資訊呢,比如列印出物件中姓名、性別和年齡,這時需要我們自定義或是重寫 Student 類的 toString() 方法,如下代碼中我們重寫 toString() 方法:
點擊查看代碼
public class Student {
private String name;
private String sex;
private Integer age;
public Student(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
我們再次執行 Test 中的 main() 方法,可得結果如下:
點擊查看代碼
Student{name='張三', sex='男', age=16}
這時就呼叫了被重寫的 toString() 方法,并按照我們的意愿對 student 物件進行了列印輸出,
總結
這里我們知道了 Java 中列印物件,如果沒有重寫 toString() 方法,那么呼叫執行的是 Object 類中的 toString() 方法,會列印該物件的類名和哈希碼,而它的哈希碼也不是物件的地址,如果想更好的輸出物件資訊,可以重寫 toString() 方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552673.html
標籤:其他
下一篇:返回列表
