1. 前提
首先,Java中的類型分為值類型與引用類型,具體差別是:
值類型(如int、double)變量中儲存的是值,例如int i=1;中,i儲存的是1。
引用類型(如String)變量中儲存的是位址,例如String str="1";中,str儲存的并不是字元串1,而是該字元串在記憶體中的位址。
2. toString()是啥
OK,那麼為啥System.out.println(i)就是輸出i儲存的内容,而System.out.println(str)輸出str指向的位址的内容。
其實很簡單,在System.out.println()函數執行時,如果發現參數是值類型,那就輸出值,如果發現參數是引用類型,就會輸出該參數的toString()方法。
那麼toString()到底是啥,toString()實際上是定義在Object類中的方法, 而Object類是所有方法的基類,也就是說實際上所有的Java類都是繼承這個類的。
例如你定義一個Student類,他就已經有.toString()方法了,原因就是繼承自Object,而輸出org.maoge.demo.StudentDemo@4511e86f這樣形式的内容,就是Object基類定義的toString()方法的功能。
package org.maoge.demo;
public class StudentDemo {
public static void main(String[] args) {
StudentDemo sd=new StudentDemo();
System.out.println(sd.toString());//輸出org.maoge.demo.StudentDemo@4511e86f
}
}
3. String方法的toString()
OK,既然Object類中的toString()方法輸出org.maoge.demo.StudentDemo@4511e86f的内容,為啥String方法的toString()是輸出字元串類型指向位址中儲存的字元串呢,這是因為String方法中的toString()被重寫了,重寫後的功能就是輸出位址中的字元串。
是以我們的Student類也可以重寫toString(),然後成為我們想要的功能,例如:
public String toString(){
return "StudentDemo是一個學生的示例";
System.out.println(sd.toString());//輸出StudentDemo是一個學生的示例
4. System.out.println的相關
因為System.out.println能識别參數内容,然後對引用類型自動調用其toString()方法,是以無需在寫System.out.println(sd.toString()),直接寫System.out.println(sd)即可。