詳解Java中的println輸入和toString方法的重寫(xiě)問(wèn)題
println()直接打印
我們都知道println()如果打印的是基本數(shù)據(jù)類(lèi)型的話直接打印出來(lái)的就是值,你如果是引用數(shù)據(jù)類(lèi)型呢?

??除掉這四類(lèi)八種基本類(lèi)型,其它的都是對(duì)象,也就是引用類(lèi)型,包括數(shù)組。
讓我們來(lái)測(cè)試一下
public class test1 {
public static void main(String[] args) {
int[] ret = {1, 2, 3, 4};
System.out.println(ret); // 括號(hào)里是一個(gè)引用數(shù)據(jù)類(lèi)型
}
}
??這是個(gè)什么東東,是地址嗎?
讓我們扒開(kāi)println的源碼看看,在IDEA中只需鼠標(biāo)放到println的位置,然后ctrl + 鼠標(biāo)左鍵點(diǎn)過(guò)去就行了,就能看到println的源碼了

??然后我們來(lái)到了valueof方法內(nèi)部

??最后來(lái)到了object類(lèi)中的toString方法內(nèi)部

??再來(lái)看看剛才我們的輸出:

好像,我們用println()打印出來(lái)的就是上面toString方法里的內(nèi)容,
而:
toString()方法是在Object類(lèi)里面的方法,它返回的是String型的數(shù)據(jù):類(lèi)名+@+哈希值的16進(jìn)制形式
??其實(shí)具體Object類(lèi)中的toString方法干了什么我們不用弄得太清楚,我們只要知道println()在打印引用數(shù)據(jù)類(lèi)型的時(shí)候打印的是Object類(lèi)中的toString內(nèi)容就好了。
但對(duì)于這個(gè)Object類(lèi),我們得說(shuō)道說(shuō)道。
Object 是Java類(lèi)庫(kù)中的一個(gè)特殊類(lèi),也是所有類(lèi)的父類(lèi)。也就是說(shuō),Java 允許把任何類(lèi)型的對(duì)象賦給 Object 類(lèi)型的變量。當(dāng)一個(gè)類(lèi)被定義后,如果沒(méi)有指定繼承的父類(lèi),那么默認(rèn)父類(lèi)就是 Object 類(lèi)。
toString的使用
??先看看這個(gè)栗子
class Student1 {
private String name;
private int score;
public Student1(String name, int score) {
this.name = name;
this.score = score;
}
}
public class test2 {
public String author = "what!!!";
public static void main(String[] args) {
// 我們自定義了一個(gè)學(xué)生對(duì)象student1
Student1 student1 = new Student1("張三", 42);
System.out.println(student1);
}
}
那我們?cè)撛鯓虞敵鲆妙?lèi)型的值呢?
我們上面不是說(shuō)了嗎?Object是所有類(lèi)的父類(lèi),既然在打印引用變量的時(shí)候調(diào)用了Object類(lèi)的toString方法,我們可以可以在object的子類(lèi)重寫(xiě)toString方法
??那么我們就可以在我們自定義的學(xué)生類(lèi)里重寫(xiě)父類(lèi)toString的方法
??同時(shí)告訴大家一個(gè)好消息,在IDEA里有相應(yīng)的快捷方式,可以幫助我們重寫(xiě)父類(lèi)的方法toString

??然后我們的代碼就變成了這樣
class Student1 {
private String name;
private int score;
public Student1(String name, int score) {
this.name = name;
this.score = score;
}
//在我們自定義的子類(lèi)里重寫(xiě)toString方法
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
public class test2 {
public static void main(String[] args) {
// 我們自定義了一個(gè)學(xué)生對(duì)象student1
Student1 student1 = new Student1("張三", 42);
System.out.println(student1);
?? 這樣的話,我們就在自己的類(lèi)中重寫(xiě)了Object的toString方法,那么println()調(diào)用的就是我們重寫(xiě)的toString方法,自然就打印出來(lái)了值。
其他的一些情況
??如果我們想打印一個(gè)數(shù)組呢?
public class test2 {
public static void main(String[] args) {
int[] ret = new int[]{1, 2, 3};
System.out.println(ret);
}
}
??如果是一個(gè)數(shù)組,我們想重寫(xiě)toString方法都不知道應(yīng)該在哪個(gè)地方重寫(xiě)。這時(shí)候我們?cè)撛趺崔k呢?別急在Arrays類(lèi)中專(zhuān)門(mén)提供了一個(gè)打印數(shù)組類(lèi)型的方法——toString
??(不要誤會(huì),這是Arrays自己的toString方法,不是從父類(lèi)Object繼承的那個(gè)toString方法,他們只是名字重合了而已。千萬(wàn)不要把他當(dāng)成是對(duì)父類(lèi)Object的toString方法的重寫(xiě),因?yàn)樗麄兊膮?shù)列表都不一樣)
public class test2 {
public static void main(String[] args) {
int[] ret = new int[]{1, 2, 3};
System.out.println(Arrays.toString(ret));
}
}
??為啥會(huì)這樣呢?我們扒拉toString的源碼就知道了---》按住ctrl,然后鼠標(biāo)放在Arrays.toString的上面,點(diǎn)進(jìn)去。

于是上面那個(gè)整形數(shù)組就按照Arrays類(lèi)中toString方法成功打印出來(lái)了。
??提醒一下,Arrays就是一個(gè)數(shù)組工具類(lèi)呀!
??????????????????????????????
??再來(lái)看看這段代碼:
public class test2 {
public static void main(String[] args) {
String name = "小魚(yú)兒";
System.out.println(name);
}
}
??因?yàn)镾tring本身就是一個(gè)類(lèi),String類(lèi)重寫(xiě)了父類(lèi)Object的toString方法??,所以在println調(diào)用Object的toString時(shí),調(diào)用的其實(shí)是String類(lèi)重寫(xiě)的toString方法。

而 String類(lèi)重寫(xiě)的toString()方法返回它本身,自然就直接打印出來(lái)了

??既然可以直接打一個(gè)對(duì)象的引用,那么如果我們想打印一個(gè)數(shù)組,數(shù)組里每個(gè)元素都是一個(gè)對(duì)象的引用呢?
class Student1 {
private String name;
private int score;
public Student1(String name, int score) {
this.name = name;
this.score = score;
}
}
public class test2 {
public String author = "what!!!";
public static void main(String[] args) {
Student1[] students = new Student1[]{
new Student1("張三", 95),
new Student1("李四", 96),
new Student1("王五", 97),
new Student1("趙六", 92),
};
// 如果我們要打印的這個(gè)數(shù)組的每一個(gè)元素都是對(duì)象的引用呢?
// 因?yàn)槭菙?shù)組,所以要用的我們的數(shù)組工具類(lèi)Aarrys對(duì)每一個(gè)數(shù)組元素進(jìn)行操作
System.out.println(Arrays.toString(students));
}
}
為啥呢?再看看Arrays類(lèi)的toString方法是怎樣處理每個(gè)對(duì)象引用就知道了
??讓我們鼠標(biāo)放在Arrays的toString方法上,按住ctrl然后鼠標(biāo)點(diǎn)進(jìn)去

??下面就是是String類(lèi)的valueOf方法

??看來(lái)Arrays類(lèi)toStirng方法對(duì)數(shù)組的每個(gè)元素都調(diào)用了父類(lèi)Object的toString方法了呀!但問(wèn)題此時(shí)我們沒(méi)有重寫(xiě)父類(lèi)的Object的toString方法呀!
你可能會(huì)說(shuō),Arrays類(lèi)不是重寫(xiě)了嗎?兄弟?。?!Arrays類(lèi)的toString是人家自己的方法,和父類(lèi)Object的toString方法沒(méi)有一點(diǎn)關(guān)系,人家只碰巧名字相同罷了。并且Arrays的toString方法是有參的,而Object的是沒(méi)參數(shù)的,怎么可能構(gòu)成重寫(xiě)呢?

??既然這樣那么就讓我們?cè)谧约憾x的學(xué)生類(lèi)中重寫(xiě)一下toString方法后,再調(diào)用Arrays.toString吧!
class Student1 {
private String name;
private int score;
public Student1(String name, int score) {
this.name = name;
this.score = score;
}
// 在我們自定義的子類(lèi)里重寫(xiě)toString方法,然后再用Arrays類(lèi)中的重寫(xiě)的toString方法
@Override
public String toString() {
return "Student1{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
}
public class test2 {
public String author = "what!!!";
public static void main(String[] args) {
Student1[] students = new Student1[]{
new Student1("張三", 95),
new Student1("李四", 96),
new Student1("王五", 97),
new Student1("趙六", 92),
};
// 如果我們要打印的這個(gè)數(shù)組的每一個(gè)元素都是對(duì)象的引用呢?
System.out.println(Arrays.toString(students));
}
}
看來(lái)還是得自己再重寫(xiě)一下toString方法??
??總結(jié)一下就是:
一個(gè)對(duì)象數(shù)組在調(diào)用Arrays.toString打印時(shí),相當(dāng)于遍歷數(shù)組,然后打印里邊每個(gè)對(duì)象,這再打印對(duì)象就調(diào)用對(duì)象自己的toString了
到此這篇關(guān)于Java中的println輸入和toString方法的重寫(xiě)的文章就介紹到這了,更多相關(guān)java println輸入和toString方法重寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
LambdaQueryWrapper的實(shí)現(xiàn)原理分析和lambda的序列化問(wèn)題
這篇文章主要介紹了LambdaQueryWrapper的實(shí)現(xiàn)原理分析和lambda的序列化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
IDEA全量替換一次性解決舊項(xiàng)目并將所有文件換行符改為L(zhǎng)F問(wèn)題
這篇文章主要介紹了IDEA全量替換一次性解決舊項(xiàng)目并將所有文件換行符改為L(zhǎng)F問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下2019-05-05
Java實(shí)現(xiàn)大文件的切割與合并操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)大文件的切割與合并操作,結(jié)合實(shí)例形式分析了java基于io及util操作大文件按指定個(gè)數(shù)分割與合并相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了使用SpringBoot發(fā)送郵箱驗(yàn)證碼的簡(jiǎn)單實(shí)現(xiàn),咱們今天來(lái)講使用QQ郵箱來(lái)發(fā)送和接收驗(yàn)證碼,首先來(lái)介紹一下它在SpringBoot項(xiàng)目中的具體應(yīng)用,需要的朋友可以參考下2023-04-04
myatisplus的saveOrUpdate的提交總是update問(wèn)題
這篇文章主要介紹了myatisplus的saveOrUpdate的提交總是update問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java實(shí)現(xiàn)向數(shù)組里添加元素
這篇文章主要介紹了Java實(shí)現(xiàn)向數(shù)組里添加元素方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
如何用匿名內(nèi)部類(lèi)實(shí)現(xiàn) Java 同步回調(diào)
這篇文章主要介紹了如何用匿名內(nèi)部類(lèi)實(shí)現(xiàn) Java 同步回調(diào),幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-10-10
java 通過(guò)發(fā)送json,post請(qǐng)求,返回json數(shù)據(jù)的方法
下面小編就為大家分享一篇java 通過(guò)發(fā)送json,post請(qǐng)求,返回json數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

