前沿
繼承:將保持已有類的特性而構(gòu)造新類的過程稱
派生:在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生
里氏替換原則:所有引用基類的地方必須能透明地使用其子類的對象抡笼。規(guī)范繼承與派生的規(guī)則苏揣。
- 1.子類可以實現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法推姻。
- 2.子類中可以增加自己特有的方法平匈。
- 3.當子類的方法重寫父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入?yún)?shù)更寬松。
- 4.當子類的方法實現(xiàn)父類的抽象方法時增炭,方法的后置條件(即方法的返回值)要比父類更嚴格忍燥。
// 我們需要完成一個兩數(shù)相減的功能,由類A來負責隙姿。
class A{
public int func1(int a, int b){
return a-b;
}
}
// 需要增加一個新的功能:完成兩數(shù)相加梅垄,然后再與100求和,由類B來負責
class B extends A{
public int func1(int a, int b){
return a+b; // 不小心重寫了父類方法
}
public int func2(int a, int b){
return func1(a,b)+100;
}
}
// 計算100 - 50 +100 = 150
B b = new B();
System.out.println("100-50="+b.func2(100, 50));
// 打印結(jié)果與實際不符合
100-50=250
總結(jié):不要重寫父類的非抽象方法输玷,遵循里式替換原則
如果非要重寫父類队丝,上例中通俗的做法:原來的父類和子類都繼承一個更通俗的基類,原有的繼承關(guān)系去掉欲鹏,采用依賴机久、聚合,組合等關(guān)系代替貌虾。
class Base {
public int func1(int a, int b){
return a-b;
}
}
class A extends Base{
}
class B extends Base{
public A a = new A(); // 采用組合的方式
public int func2(int a, int b){
return this.a.func1(a, b) + 100;
}
}
B b = new B();
System.out.println(b.func2(100, 50));
// 打印結(jié)果與實際符合
// 150