參考鏈接: 在Java中重寫toString()
前言: 在你興高采烈的寫完一個類,創建測試類時,創建對象,傳入參數,調用對象,以為會得到參數值,但突然發現輸出的是“ 類名@什么東東?(其實是散列碼,也是16進制的哈希值哈)”,反復檢查代碼,但不知怎么修改。我不知道你們有沒有這種情況發生,但是我經常就有,原因當然是因為不習慣重寫toString方法和基礎知識還不足導致的啦。還是要加油呀!所以記錄一下學習的toString()方法。?
1.1 在Object類中有一個重要的方法:toString()方法。?
作用:用于返回表示對象值的字符串?
1.2 為啥要重寫toString方法呢??
Object類中的toString方法返回的是什么呢?我們打開toString源碼發現:?
? ? public String toString() {
? ? ? ? return getClass().getName() + "@" + Integer.toHexString(hashCode());
? ? }
?
返回的字符串是:類名@散列碼。 那為什么其它類的對象返回的也是這樣的形式呢?因為所有的類的超類都是Object類。(可在類中按住ctrl+t查看繼承關系)?
例如: 創建一個People類:?
public class People {
? ? private String name;
? ? private int age;
? ? public People(String name,int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
}
?
?
測試類:?
/**
?* toString方法的調用
?* @懶惰的小黑
?*
?*/
public class toStringTest {
? ? public static void main(String[] args) {
? ? ? ? People p = new People("懶惰的小黑",20);
? ? ? ? System.out.println(p);? ? ? ? ? ? ? //p會自動調用toString方法
? ? ? ? System.out.println(p.toString());? ? //手動調用
? ? }
}
?
?
執行結果: com.xiaohei.text.People@279f2327 com.xiaohei.text.People@279f2327?
但是你想輸出的并非是這樣的結果,而是想輸出對象的具體描述(name和age),所以需要在類中重寫toString方法。 重寫toString方法:?
? ? public String toString() {
? ? ? ? return "[name = " + getName() + ",age = "+ getAge() + "]";
? ? }
?
測試:?
? ? ? ? People p = new People("懶惰的小黑",20);
? ? ? ? System.out.println(p);? ? ? ? ? ? ? //p會自動調用toString方法
?
執行結果: [name = 懶惰的小黑,age = 20]?
實際上,還可以設計的更好一些。最好通過getClass().getName() + 類的描述:獲取類名的字符串(地址)+類的描述。 例:?
? ? public String toString() {
? ? ? ? return getClass().getName() + "[name = " + getName() + ",age = "+ getAge() + "]";
? ? }
?
測試: 同上例 執行結果: com.xiaohei.text.People[name = 懶惰的小黑,age = 20]?
注意: 此處的getClass().getName()中的getName并非People類中的getName方法!?
1.3 toString方法也可供子類使用,子類只需調用super.toString()。?
例如: 創建子類:?
class Teachers extends People{
? ? private int salary;
? ? public Teachers(String name, int age,int salary) {
? ? ? ? super(name, age);
? ? ? ? this.salary = salary;
? ? }
? ? public int getSalary() {
? ? ? ? return salary;
? ? }
? ? public void setSalary(int salary) {
? ? ? ? this.salary = salary;
? ? }
? ? public String toString() {
? ? ? ? return super.toString() + ",salary = " + getSalary();
? ? }
}
?
測試:?
public class toStringTest {
? ? public static void main(String[] args) {
? ? ? ? Teachers t = new Teachers("懶惰的小黑",20,5000);
? ? ? ? System.out.println(t);
?
? ? }
}
?
?
執行結果: [name = 懶惰的小黑,age = 20],salary = 5000?
1.4 數組類型調用toString()方法?
數組繼承了Object類中的toString方法,數組類型會按舊格式打印。?
例如:?
public class ArraytoStringTest {
? ? public static void main(String[] args) {
? ? ? ? int[] a = {5,6,2,1,3};
? ? ? ? System.out.println(a);? ? ? ? ? ? //自動調用toString方法
?
執行結果:[I@1f32e575 注:[I 表明是一個整形數組。?
所以我們需要調用Array.toString 方法 例如:?
import java.util.Arrays;
?
public class ArraytoStringTest {
? ? public static void main(String[] args) {
? ? ? ? int[] a = {5,6,2,1,3};
? ? ? ? String a1 = Arrays.toString(a);
? ? ? ? System.out.println(a1);
? ? }
}
?
?
執行結果:[5, 6, 2, 1, 3]?
說明:為什么會出現這種形式呢?按住ctrl點擊toString方法,查看源碼:?
? ? public static String toString(int[] a) {
? ? ? ? if (a == null)
? ? ? ? ? ? return "null";
? ? ? ? int iMax = a.length - 1;
? ? ? ? if (iMax == -1)
? ? ? ? ? ? return "[]";
?
? ? ? ? StringBuilder b = new StringBuilder();
? ? ? ? b.append('[');
? ? ? ? for (int i = 0; ; i++) {
? ? ? ? ? ? b.append(a[i]);
? ? ? ? ? ? if (i == iMax)
? ? ? ? ? ? ? ? return b.append(']').toString();
? ? ? ? ? ? b.append(", ");
? ? ? ? }
? ? }
?
注意:打印多維數組則需調用Arrays.deepToString()方法?
總結提醒:建議類中都要重寫toString方法,方便后面程序員的調用!