天天看點

Java學習筆記--System.out.println();

package com.dabin.file;

public final class FinallyTest {
	
	public static void main(String[] args) {
		Person person = new Person("zhangsan", 25);
		System.out.println(person);
	}
}

class Person {
	private String name;
	private int age;

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	/*
	 * @Override public String toString() { return "Person [name=" + name +
	 * ", age=" + age + "]"; }
	 */
}
           

輸出結果:[email protected]

當用System.out.println(obj);列印某個對象時,如果該對象obj沒有重寫toString()方法,此時會列印出如上輸出結果,第一反應就是亂碼,其實不亂,且看下文分析:

在此之前,不妨先看看Java API 關于println()的說明:

println()方法位于java.io.PrintStream中,其中有這麼一句方法說明:Prints an Object and then terminate the line. This method calls at first String.valueOf(x) to get the printed object's string value, then behaves as though it invokes

print(String)

 and then 

println()

.首先通過valueOf(obj)方法将該對象轉為String類型,然後print(String),最後調用println(),并終止該行。

關于valueOf(obj)方法的了解可以用如下式子表示:

getClass().getName() + '@' + Integer.toHexString(hashCode())      

此時,上述的輸出結果的“亂碼”就可以得到解釋了,其中,getClass().getName():包名.類名。

如果覆寫了toString()方法,代碼如下:

package com.dabin.file;

public final class FinallyTest {

	public static void main(String[] args) {
		Person person = new Person("zhangsan", 25);
		System.out.println(person);
	}
}

class Person {
	private String name;
	private int age;

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}
           

輸出結果為:

Person [name=zhangsan, age=25]

另外,字元數組可以直接通過println()直接列印而整型數組不行,代碼如下:

public final class FinallyTest {
	
	public static void main(String[] args) {
		Person person = new Person("zhangsan", 25);
		char[] charArray = { 'a', 'b', 'c', 'd', 'e' };
		int [] intArray = {1, 2, 3};
		System.out.println(person);
		System.out.println(charArray);	//輸出:abcde
		System.out.println(intArray);	//輸出:[[email protected]
	}
}
           

以下主要介紹Java toString、String.valueOf 、(String) 的差別 摘自http://blog.csdn.net/sfantasy_2010/article/details/6727047

在java項目的實際開發和應用中,常常需要用到将對象轉為String這一基本功能。本文将對常用的轉換方法進行一個總結。常用的方法有Object#toString(),(String)要轉換的對象,String.valueOf(Object)等。下面對這些方法一一進行分析。

方法1:采用 Object#toString()方法請看下面的例子:

Object object = getObject();

System.out.println(object.toString());

在這種使用方法中,因為java.lang.Object類裡已有public方法.toString(),是以對任何嚴格意義上的java對象都可以調用此方法。但在使用時要注意,必須保證object不是null值,否則将抛出NullPointerException異常。采用這種方法時,通常派生類會覆寫Object裡的toString()方法。

方法2:采用類型轉換(String)object方法這是标準的類型轉換,将object轉成String類型的值。使用這種方法時,需要注意的是類型必須能轉成String類型。是以最好用instanceof做個類型檢查,以判斷是否可以轉換。否則容易抛出CalssCastException異常。此外,需特别小心的是因定義為Object 類型的對象在轉成String時文法檢查并不會報錯,這将可能導緻潛在的錯誤存在。這時要格外小心。如:

Object obj = new Integer(100);

String strVal = (String)obj;

在運作時将會出錯,因為将Integer類型強制轉換為String類型,無法通過。但是,

Integer obj = new Integer(100);

String strVal = (String)obj;

如是格式代碼,将會報文法錯誤。

此外,因null值可以強制轉換為任何java類類型,(String)null也是合法的。

方法3:采用String.valueOf(Object) String.valueOf(Object)的基礎是Object#toString()。但它與Object#toString()又有所不同。在前面方法1的分析中提到,使用後者時需保證不為null。但采用第三種方法時,将不用擔心object是否為null值這一問題。為了便于說明問題,我們來分析一下相關的源代碼。Jdk裡String# valueOf(Object)源碼如下:

public static String valueOf(Object obj) {

return (obj == null) ? "null" : obj.toString(); }

從上面的源碼可以很清晰的看出null值不用擔心的理由。但是,這也恰恰給了我們隐患。我們應當注意到,當object為null 時,String.valueOf(object)的值是字元串”null”,而不是null!!!在使用過程中切記要注意。試想一下,如果我們用 if(String.valueOf(object)==null){System.out.println(“傳入的值是null!”);}這樣的語句将可能會發生什麼問題。再想一下,向控制台輸出時,在視覺上如下語句在執行的結果上有什麼不同:

System.out.println(String.valueOf(null));

System.out.println(null);

我們看到的輸出将是一模一樣的東西:null,但它們意義相同嗎?

以上是對object對象轉換為String的一些總結。