1. toString()
每一個非基本類型都有一個toString()方法;當編譯器需要從對象獲取一個string時,該對象的toString()方法就會被調用。
示例:
class WaterSource {
private String s;
WaterSource() {
s = "WaterSource Constructed";
}
public String toString() {return s;}
public static void main(String[] args) {
WaterSource w = new WaterSource();
System.out.println(w);
}
}
打印的結果是:
WaterSource Constructed
2.繼承
當創建一個類時,總是在繼承。因此,除非已經明確指出要從其他類中繼承,否則就是在隱式的從JAVA的標准根類Object進行繼承。
繼承的關鍵字:extends
關鍵字super表示超類(或者基類)的意思。因此,表達式super.scrub()將調用超類的scrub()方法。
3.初始化基類
在構造器中調用基類構造器來執行初始化,而基類構造器具有執行基類初始化所需要的所有知識和能力。
對於無參數的基類構造器,會被派生類默認調用;
對於帶參數的基類構造器,派生類必須使用關鍵字super顯示地調用,並配以適當的參數。
4.try與finally
try {
...
}
finally {
...
}
關鍵字try表示,下面的塊(用{}括起來的代碼)是所謂的保護區,這意味著它需要被異常處理。其中一項特殊的處理是無論try塊怎樣退出的,保護區後的finally子句中的代碼總是要被執行的。這裡的finally子句表示的是“無論發生什麼事,一定要執行後面跟著的塊”。
5.protected關鍵字
protected關鍵字指明“就類用戶而言,這是private的,但對於任何繼承於此類的導出類或者其他任何位於同一個包內的類來說,它是可以訪問的”。
6.向上轉型
“為新的類提供方法”並不是繼承技術中最重要的方面,其最重要的方面是用來表現新類和基類之間的關系。這種關系可以用“新類是現有類的一種類型”加以概括。
由於繼承可以確保基類中所有的方法在到處類中也同樣有效,所以能夠向基類發送的所有信息同樣也向可以導出類發送。
示例
class Instrument {
public void play () {
System.out.println("Instrument play");
}
static void tune (Instrument i) {
i.play();
}
}
public class Wind extends Instrument {
public static void main(String[] args) {
Wind flute = new Wind();
Instrument.tune(flute); //upcasting
}
}
在tune中,程序代碼可以對Instrument和它所有的到處類起作用,這種將Wind引用轉換為Instrument引用的動作,稱之為“向上轉型”。
7.繼承使用
慎用繼承,其使用場合僅限於你確信使用該技術確實有效的情況。到底是改用組合還是使用繼承,一個最清晰的判斷方法就是問一問自己是否需要從新類向基類進行向上轉型。如果必須向上轉型,則繼承是必要的;但如果不需要,則應當好好考慮自己是否需要繼承。
8.final關鍵字
用final關鍵字定義編譯期常量:這種常量必須是基本類型,並且以關鍵字final表示。定義常量時,必須賦值。
按照慣例:既是static又是final的常量將用大寫表示:定義為public,則可以被用於包之外;定義為static,則強調只有一份;定義為final,則說明它是一個常量。
當final關鍵字後定義的域是對象引用時,final使引用恆定不變(一旦引用被初始化指向一個對象,就無法再把它改為指向另一個對象)。然而,對象其自身確實是可以修改的。
空白final:空白final指被聲明為final但又未給定初值的域。無論什麼情況,編譯器都確保空白final在使用前必須被初始化。但是,空白final在關鍵字final的使用上提供了更大的靈活性。為此,一個類中的final域就可以做到根據對象而有所不同,卻又保持其恆定不變的特性。
final參數:JAVA允許在參數列表中以聲明的方式將參數指明為final.這意味著你無法在方法中更改參數引用所指向的對象。
final方法:把方法鎖定,以防止任何繼承類修改它的含義。
類中所以的private方法都隱式地指定為final的。由於無法取用private方法,所以就無法覆蓋它。可以對private方法添加final修飾詞,但這並不能給該方法增加任何額外的意義。
final類:將某個類定義為final時,表明了你不打算繼承該類,而且也不允許別人這樣做。
8.初始化及類的加載
一般來說,類的代碼在初次使用時才加載。這通常指加載發生於創建類的第一個對象之時,但是當訪問static域或者static方法時,也會發生加載。
當一個類在加載時,編譯器注意到它有一個基類,則加載完該類,繼續加載基類。如果基類還有其自身的基類,則繼續加載基類的基類。依次類推。
類加載完成之後,根基類的static初始化會被執行,然後是下一個到處類的staic初始化被執行,依次類推。
至此,類的加載完畢,可以創建對象了。