記錄:肖佳嘉
繼承和組成
1,設計父類
- 儘量將父類所有成員都設置成private訪問類型,不要讓子類直接訪問父類的成員變量
- 儘量不要讓子類訪問、修改父類的方法,應用private讓子類無法訪問該方法,如果需要被調用,則必須用public + final 形式,如果希望被子類重寫,但不希望被其他類訪問,用protect修飾
- 儘量不要在父類構造器中調用將要被子類重寫的方法,如果在父類構造中調用了將要被子類重寫的方法,那麼創建對象的時候,會默認調用被覆蓋後的方法,產生空指針異常
2,派生子類的條件(滿足其一):
- 子類需要額外增加屬性
- 子類需要增加獨有的行爲方式
組合的使用
class Bird
{
// 將原來的父類組合到原來的子類,作爲子類的一個組合成分
private Animal a;
public Bird(Animal a)
{
this.a = a;
}
// 重新定義一個自己的breath()方法
public void breath()
{
// 直接複用Animal提供的breath()方法來實現Bird的breath()方法。
a.breath();
}
public void fly()
{
System.out.println("我在天空自在的飛翔...");
}
}
class Wolf
{
// 將原來的父類組合到原來的子類,作爲子類的一個組合成分
private Animal a;
public Wolf(Animal a)
{
this.a = a;
}
// 重新定義一個自己的breath()方法
public void breath()
{
// 直接複用Animal提供的breath()方法來實現Wolf的breath()方法。
a.breath();
}
public void run()
{
System.out.println("我在陸地上的快速奔跑...");
}
}
public class CompositeTest
{
public static void main(String[] args)
{
// 此時需要顯式創建被組合的對象
Animal a1 = new Animal();
Bird b = new Bird(a1);
b.breath();
b.fly();
// 此時需要顯式創建被組合的對象
Animal a2 = new Animal();
Wolf w = new Wolf(a2);
w.breath();
w.run();
}
}
·
何時用?
記住兩個關係:繼承表達的是is-a關係;
組合表達的是has-a關係