真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么優(yōu)雅地打印一個(gè)Java對象

本文小編為大家詳細(xì)介紹“怎么優(yōu)雅地打印一個(gè)Java對象”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“怎么優(yōu)雅地打印一個(gè)Java對象”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

創(chuàng)新互聯(lián)是一家專業(yè)提供旌陽企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為旌陽眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

提問者定義了這樣一個(gè)類:

public class Cmower {     private String name;      public Cmower(String name) {         this.name = name;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     } }

然后創(chuàng)建了一個(gè)該類的對象,并嘗試打印它:

Cmower cmower = new Cmower("沉默王二"); System.out.println(cmower);

但是輸出的結(jié)果并不是他想要的:

com.cmower.java_demo.stackoverflow.printObject.Cmower@355da254

除此之外,他在打印數(shù)組的時(shí)候也出現(xiàn)了相似的問題:

Cmower [] cmowers = {new Cmower("沉默王二"), new Cmower("沉默王三")}; System.out.println(cmowers);

輸出結(jié)果為:

[Lcom.cmower.java_demo.stackoverflow.printObject.Cmower;@4dc63996

Cmower@355da254 和 [LCmower;@4dc63996 這樣的輸出結(jié)果代表著什么意思呢?怎么樣才能把 Cmower 類的 name  打印出來呢?以及如何打印一個(gè)對象的列表(數(shù)組或者集合)呢?

如果大家也被這樣的問題困擾過,或者正在被困擾,就請隨我來,咱們肩并肩手拉手一起梳理一下這個(gè)問題,并找出優(yōu)秀答案。Duang、Duang、Duang,打怪進(jìn)階嘍!

01、究竟發(fā)生了什么?

所有的 Java 對象都默認(rèn)附帶了一個(gè) toString() 的方法,當(dāng)我們嘗試打印這個(gè)對象的時(shí)候,該方法就會(huì)被調(diào)用。

System.out.println(object);  // 調(diào)用 object.toString()

toString() 方法由 Object 類(所有 Java 對象的超類)定義,該方法會(huì)返回一個(gè)看起來晦澀難懂的字符串:

1)Class 名,由包名和類名組成,比如 com.Cmower;

2)@ 連接符;

3)十六進(jìn)制的哈希碼。

來看一下該方法的源碼:

public String toString() {     return getClass().getName() + "@" + Integer.toHexString(hashCode()); }

數(shù)組和普通的 Java 對象類似,只有一點(diǎn)點(diǎn)不同——追蹤 Class 類的 getName()方法就可以印證這一點(diǎn)。

If this class object represents a class of arrays, then the internal form of  the name consists of the name of the element type preceded by one or more '['  characters representing the depth of the array nesting.

大致的意思就是,如果是一個(gè)數(shù)組的話,Class  名的前面會(huì)有一個(gè)或者多個(gè)英文中括號“[”,表示數(shù)組的維度(一維數(shù)組為一個(gè)“[”,二維數(shù)組為兩個(gè)“[”),然后再緊跟一個(gè)元素的類型首字母。

怎么優(yōu)雅地打印一個(gè)Java對象

這就是為什么對象數(shù)組的前綴是“[L”的原因。是不是有一種恍然大悟的感覺?

02、自定義輸出

如果想在打印的時(shí)候輸出自己預(yù)期的結(jié)果,就必須在自定義類中重寫 toString() 方法,來看例子。

public class Cmower {     private String name;     // 省略構(gòu)造方法和 getter/setter      @Override     public String toString() {         return name;     } }

當(dāng)我們再次打印 Cmower 對象時(shí),輸出結(jié)果就不再是 com.Cmower@355da254 了。

沉默王二

但是這樣的結(jié)果并不會(huì)令我們滿意,它有些突兀,沒法表示對象的類型。更優(yōu)雅的做法是這樣的:

public class Cmower {     private String name;     // 省略構(gòu)造方法和 getter/setter      @Override     public String toString() {         return getClass().getSimpleName() + "[name=" + name + "]";     } }

再次打印 Cmower 對象,輸出結(jié)果為:

Cmower[name=沉默王二]

這樣的形式不僅看起來美觀,還能夠在調(diào)試的時(shí)候給出有用的信息。但是,有時(shí)候我們不想重寫 toString() 方法(想保留原有的打印格式  ClassType@123121),又想打印該對象的信息,那么最好定義一個(gè)新的方法,比如說 toMyString() 方法。

03、自動(dòng)化輸出

IDE(Eclipse 或者 Intellj IDEA) 通常會(huì)提供一種針對類的字段的輸出格式,用來覆蓋 toString()  方法。

@Override public String toString() {     return "Cmower{" +             "name='" + name + '\'' +             '}'; }

另外,一些開源的第三方類庫也會(huì)提供這樣的功能,比如說:

1)Apache Commons Lang 的 ToStringBuilder。

使用方法:

@Override public String toString() {     return ToStringBuilder.reflectionToString(this); }

輸出結(jié)果:

com.cmower.printObject.Cmower@355da254[name=沉默王二]

2)Google Guava 的 MoreObjects

使用方法:

@Override public String toString() {     return MoreObjects.toStringHelper(this)             .add("name", getName())             .toString(); }

輸出結(jié)果:

Cmower{name=沉默王二}

3)Lombok 的 @toString 注解(IDE 需要先安裝 Lombok 的插件)

使用方法:

@ToString public class Cmower {      private String name;      // 省略構(gòu)造方法和 getter/setter }

只需要一個(gè) @toString 注解,不需要覆蓋 toString() 方法。

輸出結(jié)果:

Cmower(name=沉默王二)

04、打印對象列表(數(shù)組或者集合)

上述內(nèi)容已經(jīng)把打印單個(gè)對象的事情嘮明白了,are you ok?接下來,我們來說道說道打印對象列表的事兒。

1)數(shù)組

Arrays.toString() 可以將任意類型的數(shù)組轉(zhuǎn)成字符串,包括基本類型數(shù)組和引用類型數(shù)組。代碼示例如下。

Cmower[] cmowers = {new Cmower("沉默王二"), new Cmower("沉默王三")}; System.out.println(Arrays.toString(cmowers));

輸出結(jié)果:

[Cmower{name='沉默王二'}, Cmower{name='沉默王三'}]

2)集合

對于集合來說,可以直接打印就能輸出我們預(yù)期的結(jié)果。代碼示例如下。

List list = new ArrayList<>(); list.add(new Cmower("沉默王二")); list.add(new Cmower("沉默王三")); System.out.println(list);

輸出結(jié)果:

[Cmower{name='沉默王二'}, Cmower{name='沉默王三'}]

讀到這里,這篇“怎么優(yōu)雅地打印一個(gè)Java對象”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章標(biāo)題:怎么優(yōu)雅地打印一個(gè)Java對象
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/gchsdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部