super關鍵字
public Manager(String name, double salary, int year, int month, int day){
super(name, salary, year, month, day);
bonus = 0;
}
這裏的關鍵字super具有不同的含義。語句super(n, s, year, month, day);
是“調用超類Employee中含有n、s、year、month和day參數的構造器”的簡寫形式。
由於Manager類的構造器不能訪問Employee類的私有域,所以必須利用Employee類的構造器對這部分私有域進行初始化,我們可以通過super實現對超類構造器的調用。使用super調用構造器的語句必須是子類構造器的第一條語句。
注意區分this
和super
關鍵字。
關鍵字this
的兩個用途:
- 引用yin’shi隱式參數
- 調用該類其他的構造器
關鍵字super
的兩個用途:
- 調用超類的方法
- 調用超類的構造器
調用構造器的語句只能作爲另一個構造器的第一天語句
理解方法調用
- 編譯器查看對象的聲明類型和方法名
- 接下來編譯器將查看調用方法時提供的參數類型
- 至此,編譯器已獲得需要調用的方法名字和參數類型
強制類型轉換
在進行類型轉換之前,先查看一下是否能夠成功地轉換。這個過程簡單地使用instanceof操作符就可以實現。
Object:所有類的超類
Object類是Java中所有類的始祖,在Java中每個類都是由他擴展而來的。
Object類中的equals方法用於監測一個對象是否等於另外一個對象。在Object類中,這個方法判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用,他們一定是相等的。
對象包裝器與自動裝箱
這些對象包裝器類擁有很明顯的名字:Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean(前6個類派生於公共的超類Number)
反射
反射庫(reflection library)提供了一個非常豐富且精心設計的工具集,以便編寫能夠動態操縱Java代碼的程序。
能夠分析類能力的程序成爲反射(reflective)
反射機制可以用來:
- 在運行時分析類的能力
- 在運行時查看對象,例如,編寫一個toString方法供所有類使用
- 實現通用的數組操作碼
- 利用Method對象,這個對象很想C++中的函數指針
Object類中的getClass()方法將會返回一個Class類型的實例。
最常用的Class方法是getName。這個方法將返回類的名字。
Class類實際上是一個泛型類。
newInstance()方法可以用來動態地創建一個類的實例。
捕獲異常
當程序運行過程中發生錯誤時,就會“拋出異常”。拋出異常比終止程序要靈活得多,這是因爲可以提供一個“捕獲”異常的處理器(handler)對異常情況進行處理。
如果沒有提供處理器, 程序就會終止,並在控制檯上打印出一條信息,其中給出了異常的類型。可能在前面已經看到過一些異常報告,例如,偶然使用了null引用或者數組越界等。
異常有兩種類型:未檢查異常和已檢查異常。對於已檢查異常,編譯器將會檢查是否提供了處理器。然而,有很多常見的異常,例如,訪問null引用,都屬於未檢查異常。編譯器不會查看是否爲這些錯誤提供了處理器。畢竟,應該精心地編寫代碼來避免這些錯誤的發生,而不要將精力花在編寫異常處理器上。
利用反射分析類的能力
在java.long.reflect包中有三個類Field、Method和Constructor分別用於描述類的域、方法和構造器。
Class類中地getFields、getMethods和getConstructors方法將分別返回類提供的public域、方法和構造器數組,其中包括超類的公有成員。Class類的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法將分別返回類中聲明的全部域、方法和構造器,其中包括私有和受保護成員,但不包括超類的成員。
繼承的設計技巧
- 將公共操作和域放在超類
- 不要使用受保護的域
- 使用繼承實現“is-a”關係
- 除非所有繼承的方法都有意義,否則不要使用繼承
- 在覆蓋方法時,不要改變預期的行爲
- 使用多態,而非類型信息
- 不要過多地使用反射