Java核心技術-繼承

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調用構造器的語句必須是子類構造器的第一條語句。

注意區分thissuper關鍵字。

關鍵字this的兩個用途:

  1. 引用yin’shi隱式參數
  2. 調用該類其他的構造器

關鍵字super的兩個用途:

  1. 調用超類的方法
  2. 調用超類的構造器

調用構造器的語句只能作爲另一個構造器的第一天語句

理解方法調用

  1. 編譯器查看對象的聲明類型和方法名
  2. 接下來編譯器將查看調用方法時提供的參數類型
  3. 至此,編譯器已獲得需要調用的方法名字和參數類型

強制類型轉換

在進行類型轉換之前,先查看一下是否能夠成功地轉換。這個過程簡單地使用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方法將分別返回類中聲明的全部域、方法和構造器,其中包括私有和受保護成員,但不包括超類的成員。

繼承的設計技巧

  1. 將公共操作和域放在超類
  2. 不要使用受保護的域
  3. 使用繼承實現“is-a”關係
  4. 除非所有繼承的方法都有意義,否則不要使用繼承
  5. 在覆蓋方法時,不要改變預期的行爲
  6. 使用多態,而非類型信息
  7. 不要過多地使用反射
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章