[轉載] java重寫toString()方法

參考鏈接: 在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方法,方便后面程序員的調用!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

haproxy+keepalived實現負載均衡及高可用

HAProxy是一個使用C語言編寫的自由及開放源代碼軟件,其提供高性能性、負載均衡,以及基于TCP和HTTP的應用程序代理。相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支持更多的選項,更精細的控制,更多的健…

[轉載] Java中變量與常量

參考鏈接: Java中的實例變量隱藏 1、變量的定義:定義變量就是要告訴編譯器這個變量的數據類型,這樣編譯器才知道需要分配多少空間給它,以及它能存放什么樣的數據。在程序運行過程中空間的值是變化的,這個內存空間就成…

Linux-實用快捷鍵操作

博文說明【前言】: 本文將通過個人口吻介紹Linux下一些常用的實用快捷鍵,在目前時間點【2017年6月14號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在后續工作…

iOS技術博客:App備案指南

📝 摘要 本文介紹了移動應用程序(App)備案的重要性和流程。備案是規范App開發和運營的必要手段,有助于保護用戶權益、維護網絡安全和社會秩序。為了幫助開發者更好地了解備案流程,本文提供了一份最新、最全、最詳的備…

[轉載] Java中靜態成員變量,靜態代碼塊,靜態內部類何時被初始化?

參考鏈接: Java中的初始化程序塊Initializer Block 關于這個問題,本文不扯理論,直接上代碼,通過結果來驗證結論,廢話少說,測試代碼如下: public class StaticTest { public static StaticMem…

mikrotik dhcp server

操作路徑: /ip dhcp-server 關聯操作: /ip pool屬性 述 dhcp server interface (名稱) – 選擇 DHCP 服務的網絡接口 dhcp address space (IP 地址/掩碼; 默認: 192.168.0.0/24) – DHCP 服務器將出租給客戶端的網絡地 址段 gateway (IP 地址; 默認: 0.0.0.0) – 分配給客戶端的…

[轉載] Java static關鍵字與static{}語句塊

參考鏈接: Java中的靜態塊static block 目錄直通車 一、 類的加載特性與時機 1、 類加載的特性 2、 類加載的時機 二、 static的三個常用 1、 修飾成員變量 2、 修飾成員方法 3、 靜態塊(static{}) 一、 類的加載特性與時機 …

Perl文件讀寫操作

本文轉自 tiger506 51CTO博客,原文鏈接:http://blog.51cto.com/tiger506/830771,如需轉載請自行聯系原作者

[轉載] Java 語言中的實例初始化塊 ( IIB) 詳解

參考鏈接: Java中的實例初始化塊(IIB) 在 Java 語言中的類初始化塊 文章中我們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我覺得介紹的有點簡單了,于是,再寫一篇文章詳細介紹下吧。 Java 語言中,存在三種操作&#x…

不用正則表達式,用javascript從零寫一個模板引擎(一)

前言 模板引擎的作用就是將模板渲染成html,html render(template,data),常見的js模板引擎有Pug,Nunjucks,Mustache等。網上一些制作模板引擎的文章大部分是用正則表達式做一些hack工作,看完能收獲的東西很少。本文將使用編譯原理那套理論來打…

[轉載] Java靜態綁定與動態綁定

參考鏈接: Java中的靜態綁定與動態綁定 程序綁定的概念: 綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或者叫做前期綁定和后期綁定. 靜態綁定: 在程序執行前方…

關于批量插入數據之我見(100萬級別的數據,mysql)

2019獨角獸企業重金招聘Python工程師標準>>> 因前段時間去面試,問到如何高效向數據庫插入10萬條記錄,之前沒處理過類似問題,也沒看過相關資料,結果沒答上來,今天就查了些資料,總結出三種方法&am…

各個OS關于查看磁盤和wwn號的方法

1,HP-UX幾個命令1)查看型號,和uname -a差不多model2)查看光纖卡信息ioscan -funC fc3) 查看掃描出的磁盤信息ioscan -fucC disk4)查看磁盤及其對應的路徑ioscan -m dsf5) 查看劃分過來的lunioscan -m lun6) 查看磁盤大小diskinfo …

[轉載] Java是不是面向對象的程序

參考鏈接: 為什么Java不是純粹的面向對象語言 轉載自:https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否確實的 “純面向對象”?讓我們深入到Java的世界,試圖來證實它。 在我剛開始學習 Java 的前面幾…

極速理解設計模式系列:6.適配器模式(Adapter Pattern)

四個角色:目標抽象類角色(Target)、目標對象角色(Adapter)、源對象角色(Adaptee)、客戶端角色(Client) 目標抽象類角色(Target):定義需要實現的目標接口 目標對象角色(Adapter):調用另外一個源對象,并且轉換…

[轉載] Java之繼承

參考鏈接: Java多重繼承 Java之繼承 繼承是面向對象程序的一個基本特征,通過繼承可以實現父子關系,以及代碼的復用。通過繼承實現的類稱為子類,被繼承的類稱為父類,所有直接或間接被繼承的類都稱為父類。 Java類體…

Spark(二): 內存管理

2019獨角獸企業重金招聘Python工程師標準>>> Spark 作為一個以擅長內存計算為優勢的計算引擎,內存管理方案是其非常重要的模塊; Spark的內存可以大體歸為兩類:execution和storage,前者包括shuffles、joins、sorts和agg…

[轉載] 手把手教你整合最優雅SSM框架:SpringMVC + Spring + MyBatis

參考鏈接: Java繼承類的對象創建 本文發表于2016年6月,寫于作者學生時期。文中使用到的技術和框架可能不是當下最佳實踐,甚至很不“優雅”。但對于剛接觸JavaEE和Spring的同學來說,還是能有很多收獲的,大牛輕拍 我們…

多播、組播、廣播優缺點分析

2019獨角獸企業重金招聘Python工程師標準>>> 單播、多播和廣播單播”(Unicast)、“多播”(Multicast)和“廣播”(Broadcast)這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究…

[轉載] Java重載、覆蓋與構造函數

參考鏈接: Java中的繼承和構造函數 /** * 拷貝構造函數---Copyf t2 new Copyf(t1);就不會在調用默認構造函數了。 * 復制clone和引用 * 重載是在同一個類(范圍)中,覆蓋是子類對父類而言。 重載不關心返回值類型。 靜態方法不能被…