public class SprinklerSystem { private String value1, value2, value3; private WaterSource source = new WaterSource(); private int i; private float f; ...
public class SprinklerSystem { private String value1, value2, value3; private WaterSource source = new WaterSource(); private int i; private float f; @Override public String toString() { return "SprinklerSystem{" + "value1='" + value1 + '\'' + ", value2='" + value2 + '\'' + ", value3='" + value3 + '\'' + ", source=" + source + ", i=" + i + ", f=" + f + '}'; } public static void main(String[] args) { SprinklerSystem sprinklers = new SprinklerSystem(); System.out.println(sprinklers); } } class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = "Constructed"; } @Override public String toString() { return s; } }
在上面兩個類定義的方法中,有一個很特殊:toString()。每一個非基本類型的對象都有一個toString()方法,而且當編譯器需要一個String而你卻只有一個對象時,該方法便會被調用,
所以在SprinklerSystem.toString()的表達式中:
"source = " + source;
編譯器將會得知你想要將一個String對象("soucre = ") 同WaterSource相加。由於只能將一個String對象與另一個String對象相加,因此編譯器會告訴你:" 我將調用toString(),把source轉換成為一個String!"這樣做之後,它就能將兩個String連接到一起並將結果傳遞給System.out.println()。每當想要使創建的類具備這樣的行為時,僅需要編寫一個toString()方法即可。
類中域為基本類型時能夠自動被初始化為0。但是對象引用會被初始化為null,而且如果你試圖為它們調用任何方法,都會得到一個異常——運行時錯誤。很方便的是,在不拋出異常的情況下仍舊可以列印出一個null引用。
編譯器並不是簡單地為每一個引用都創建預設對象,這一點是很有意義的,因為若真要那樣做的話,就會在許多情況下增加不必要的負擔。如果想初始化這些引用,可以在代碼中的下列位置進行:
- 1. 在定義對象的地方。這意味著它們總是能夠在構造器被調用之前被初始化
- 2. 在類的構造器中
- 3. 就在正要使用這些對象之前,這種方式稱為惰性初始化。在生成對象不值得及不必每次都生成對象的情況下,這種方式可以減少額外的負擔。
- 4. 使用實例初始化。
- 以下是這四種方式的示例:
class Soap { private String s; Soap() { System.out.println("Soap"); s = "Constructed"; } @Override public String toString() { return s; } } public class Bath { private String s1 = "Happy", s2 = "Happy", s3 ,s4; private Soap castille; private int i; private float toy; public Bath() { System.out.println("Inside Bath()"); s3 = "Joy"; toy = 3.14f; castille = new Soap(); } {i = 47;} @Override public String toString() { if(s4 == null) s4 = "joy"; return "Bath{" + "s1='" + s1 + '\'' + ", s2='" + s2 + '\'' + ", s3='" + s3 + '\'' + ", s4='" + s4 + '\'' + ", castille=" + castille + ", i=" + i + ", toy=" + toy + '}'; } public static void main(String[] args) { Bath b = new Bath(); System.out.println(b); }