剛學習Java時第一個接觸的method就是System.out.println() 方法。但是最近在使用它輸出一些變量時出現了我不理解的現象,首先上代碼:
1 /* 2 * 3 * using method System.out.println/print 4 * 5 * 6 */ 7 class Student{ 8 9 String name ; 10 Student(String name){ 11 this.name = name ; 12 } 13 void show (){ 14 System.out.println("name is :" + name ); 15 } 16 17 } 18 public class TestOutString { 19 20 public static void main(String[] args){ 21 int varInt = 1 ; 22 char varChar = 'h'; 23 String varString = "hello world !"; 24 int[] intArray = {1,2,3}; 25 char[] charArray = {'1','2','3','4'}; 26 Student studentObject = new Student("first"); 27 Student[] studentArray = {new Student("1"),new Student("2"),new Student("3")}; 28 String[] stringArray = {"1","2","3","4"}; 29 boolean[] booleanArray = {true , false , true , false}; 30 31 32 System.out.println(varInt); 33 System.out.println(varChar); 34 System.out.println(varString); 35 System.out.println(intArray); 36 System.out.println(charArray); 37 System.out.println(studentObject); 38 System.out.println(studentArray); 39 System.out.println(stringArray); 40 41 /* 42 Result : 43 44 1 45 h 46 hello world ! 47 [I@54477b4e 48 1234 49 Student@20f0691c 50 [LStudent;@784be29 51 [Ljava.lang.String;@1be0799a 52 53 Question : 54 55 we will get different value by using method--'System.out.println/print' 56 57 to output some variables with different type 58 59 */

由上程序可以看出:
使用System.out.println()輸出基本數據類型和char數組時正常,但是在輸出int、string、object、object數組、Boolean數組時出現只輸出類似 '類名 @ 一串十六進制的數' 的字符串。發現原因有以下幾點:
1. System.out.println()(是PrintStream類的成員方法)方法只提供了以下幾種數據類型輸出的重載函數:

所以我們在輸出 boolean 、 char 、char【】 、 double 、float 、int 、 long 數據時會輸出其對應的值。對於object的輸出System.out.println方法會首先調用其 toString方法,然后將該對象的toString方法的返回值輸出。關於toString方法的具體輸出會在下面說明。
2. 由於System.out.println沒有對int[] 、String[] 、 object[] 數組輸出的重載函數,所以在使用該方法輸出這些數據類型時,該方法會將其中的參數作數組首元素來對待。也就 是說,System.out.println(intArray) 等價於 System.out.println(intArray[0])。然后調用數組首元素的toString方法,並將其輸出。
toString()方法:
是所有對象的超類,它的功能是返回一個字符串,這個字符串由 調用它的類的類名 + @ + 調用它的類的哈希值十六進制表示形式 組成。
即 :getClass().getName() + '@' + Integer.toHexString(hashCode())
由以上兩個原因應該可以得到上面輸出結果是由什么導致的了。
那么如何讓我定義的數據直接通過System.out.println輸出其值呢 ?
我認為:
對於System.out.println()支持的數據類型例如: int 、 double、char【】 等可以直接輸出其值。
對於Object類型的數據,可以重寫它的toString() 方法,按照自己的想法輸出。因為System.out.println輸出object類型值時就是調用其toString方法。
對於System.out.println不支持的數據類型例如 : int[] / double[] / String[] /boolean 等,可以使用類集,例如 ArrayList等,
1 ArrayList<Integer> intList = new ArrayList<Integer>(); 2 intList.add(1); 3 intList.add(2); 4 intList.add(3); 5 intList.add(4); 6 System.out.println(intList);
這樣就可以輸出其值

當然如果你對這樣的輸出不夠滿意,也同樣可以重寫ArrayLIst等類集框架的toString方法,因為System.out.println方法在輸出ArrayList等類集變量時就是調用其toString方法。
