1、超類和子類
超類和子類
父類與子類
多態:
一個對象變量可以指示多種實際類型的現象稱為多態
一個變量可以引用父類對象,也可以引用其子類對象,這就是多態。
不能將一個超類的引用賦給子類變量,因為調用子類方法時可能發生運行錯誤
子類引用可以賦給超類引用
動態綁定:
在運行時能夠自動地選擇哪個方法的現象稱為動態綁定
是一個非常重要的特性,無需對現存的代碼進行修改,就可以對程序進行擴展。
阻止繼承:final類和方法
將方法和類聲明為final主要目的是:確保它們不會在子類中改變語句
強制類型轉換
只能在繼承層次內進行類型轉換。
在將超類轉換成子類之前,應該使用instanceof進行檢查。
抽象類
使用abstract關鍵字,這樣就完全不需實現這個方法。
為了提高程序清晰度,包含一個或多個抽象方法的類本身必須被聲明為抽象的。
除了抽象方法外,抽象類還可以包含具體數據和具體方法。
盡量將通用的域和方法(不管是否是抽象的)放在超類(不管是否是抽象類)中
擴展抽象類
1 子類中定義部分抽象方法或抽象方法也不定義,這樣就必須將子類也標記為抽象類
2 定義全部的抽象方法,子類就不是抽象的了
抽象類不能被實例化 (不能new)這個類的對象
可以創建一個具體子類的對象,可以定義一個抽象類變量,但是它只能引用非抽象子類的對象。
受保護訪問
private 子類不能訪問超類的私有域,
protected 允許子類訪問超類的某個域
2、Object:所有類的超類
Object是Java的始祖,在Java中每個類都是由它擴展而來
可以使用Object類型的變量引用任何類型的對象
eqluas方法
用于檢測一個對象是否等于另一個對象,在Object類中,這個方法將判斷兩個對象是否具有相同的引用。
在子類中定義equals方法時,首先調用超類的equals。如果檢測失敗,對象就不可能相等。
如果超類中的域都相等,就需要比較子類中的實例域。
相等測試與繼承
Java語言規范要求equals方法具有下面的特性:
自反性:x.eqluas(x) 返回true
對稱性:當且僅當x.eqluas(y) 返回true,y.eqluas(x)返回true
傳遞性:如果x.eqluas(y)返回true,y.eqluas(z)返回true,x.equlas(z)也應該返回true
一致性:如果x,y引用的對象沒有發生變化,反復調用x.eqluas(y)應該返回同樣的結果
對于任意非空引用x,x.eqluas(null) 應該返回false
對稱性,instanceof 子類與超類的比較
如果子類能夠擁有自己的相等概念,則對稱性需求將強制采用getClass進行檢測
如果由超類決定相等的概念,那么就可以使用instanceof進行檢測,這樣可以在不同子類的對象之間進行相等的比較。
編寫一個完美的equals方法的建議:
1 顯式參數命名為otherObject,稍后需要將它轉換成另一個叫做other的變量
2 檢測this 與 otherObject是否引用同一個對象:
if(this == otherObject) return true;
3 檢測otherObject是否為null,如果是null ,返回false
if(otherObjecr == null) return false;
4 比較this 與 otherObject是否屬于同一個類。
如果equals的語義在每個子類中所改變,就使用getClass檢測
if(getClass != otherObject.getClass()) return false;
如果所有的子類都擁有統一的語義,就使用instanceof檢測
if(!otherObject instanceof ClassName) return false;
5 將otherObject轉換為相應的類類型變量
ClassName other = (ClassName)otherObjecrt;
6 現在開始對所有需要比較的域進行比較了。使用==比較基本類型域,使用equals比較對象域。
如果在子類重新定義equals,就要調用super.equlas(other);
hashCode方法
散列碼(hashCode)是由對象導出的一個整數值。
hashCode定義在Object類中,因此每個對象都有一個默認的散列碼,其值為對象的存儲位置。
如果重新定義equals方法,就必須重新定義hashCode方法,以便用戶可以將對象插入到散列表中
toString方法
3、泛型數組列表
訪問數組列表對象
ArrayList
不必指出數組的大小
使用add將任意多的元素添加到數組
使用size()替代length計算元素的數目
使用a.get(i)替代a[i]訪問元素
4、對象包裝器與自動裝箱
基本類型 轉換為 對象
5、參數數量可變的方法
省略號...是Java代碼的一部分,它表明這個方法可以接收任意數量的對象
6、枚舉類
Enum
7、反射
反射機制:
在運行中分析類的能力
在運行中查看對象
實現通用的數組操作代碼
利用Method對象
Class類
Class.forName().newInstance();
捕獲異常
try catch
利用反射分析類的能力
Field Method Constructor
三個類都有
getName返回項目的名稱
getModifiers 返回一個整型數值,描述修飾符
Field getType 返回描述域所屬類型的Class對象
getFileds
getDeclaredFileds
在運行時使用反射分析對象
setAccessible
使用反射編寫泛型數組代碼
CopyOf
調用任意方法
Method invoke
8、繼承設計的技巧
1、將公共操作和域放在超類
2、不要使用受保護的域
3、使用繼承實現 is-a 關系
4、除非所有集成的方法都有意義,否則不要使用繼承
5、在覆蓋方法時,不要改變預期的行為
6、使用多態,而非類型信息
7、不要過多的使用反射
原文:http://www.cnblogs.com/loveincode/p/7188320.html