☆ 繼承 ☆
- 繼承是面向對象思想的三大特性之一,使類與類之間產生特殊 - 一般的關係,即is-a關係。
- 繼承是從已有類中派生出新的類,新的類能吸收已有類的屬性和方法,並且能拓展新的屬性和行爲。
- 在Java中使用extends關鍵字表示繼承,語法表示爲: class 子類 extends 父類{}。
- 子類被稱爲派生類,父類又被稱爲超類。
- 子類繼承父類,表明子類是一種特殊的父類,子類擁有父類的屬性和方法,並且子類可以拓展具有父類所沒有的一些屬性和方法。
- 子類即使不擴展父類,也能維持擁有父類的操作。
優缺點
優點
提高了代碼的複用性
提高了代碼的維護性
讓類與類之間產生了關係,是多態的前提
缺點
增加了耦合性
OOP思想開發原則:高內聚,低耦合
耦合:類與類之間的關係
內聚:自身完成事情的能力
繼承特點
Java只支持單繼承,不支持多重繼承操作(extends A,B,C…)
class A {}
class B {}
class C extends A,B {} // 錯誤的,一個子類繼承了兩個父類,Java中不允許
爲什麼只支持單繼承?
多繼承會存在安全隱患,因爲當繼承的多個類都存在相同的屬性或方法名相同方法體不同的方法,子類進行調用時,就會產生不知道該調用哪一個類中的方法的情況。
Java支持多層繼承(繼承體系)
class A {}
class B extends A {}
class C extends B {}
超類Animal派生出子類Dog
public class Ch_4_13{
public static void main (String[] args) {
Dog d=new Dog();
d.name="Snoppy"; d.age=3; d.bark(); //引用完全合法
}
}
class Animal {
public String name;
public int age;
public void eat(){ System.out.println(name +" are eating!");}
}
class Dog extends Animal {
public void bark(){ System.out.println("Dog barks!");}
}
☁ is - A 與 has - A 關係
has - A: 意爲“有什麼”,刻畫的是類與成員之間的關係,決定了對象能實施的動作。
is - A: 意爲“是什麼”,刻畫的是對象與類之間的關係,可用於判別對象間的賦值兼容。
class Animal {
public String name;
public int age;
public void eat(){ System.out.println(name +" are eating!");}
}
class Dog extends Animal {
public void bark(){ System.out.println("Dog barks!");}
}
Animal a = new Dog();//合法,因爲Dog和Animal滿足is-A關係,即Dog對象是Animal對象
a.age = 2;//合法,a是Animal類型,Animal與age滿足has-A關係
a.bark();//非法,a是Animal類型,Animal與bark()不滿足has-A關係
Dog d = new Animal();//非法,Animal對象不一定是Dog
☆ 多態 ☆
多態概述
- 多態是繼封裝、繼承之後,面向對象的第三大特性。
- 多態現實意義理解:
a. 現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。
b. Java作爲面向對象的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的對象便既是Student,又是Person。 - 前提條件:必須有子父類關係。
- 多態體現爲父類引用變量可以指向子類對象。
- 在使用多態後的父類引用變量調用方法時,會調用子類重寫後的方法。
重寫(Override)
從字面上看,重寫就是重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類並不想原封不動的繼承父類中的某個方法,所以在方法名,參數列表,返回類型都相同的情況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函數的訪問修飾權限不能少於父類的。
- 發生在父類與子類之間
- 方法名,參數列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同
- final 方法不能被子類重寫
- 靜態方法不能被子類重寫
- 訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
- 重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常
class A{
public void f(int x){;}
}
public class Ch_4_20 extends A{
public void f(int x){;} //對超類A中的f()正確的重寫
//void f(double x){;} //是重載,而不是重寫
//public int f(int x){return 0;} //編譯錯,不能根據返回類型來區分重寫
//void f(int x){;} //編譯錯,重寫時縮小了訪問權限
}
重載(Overload)
在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同甚至是參數順序不同)則視爲重載。同時,重載對返回類型沒有要求,可以相同也可以不同,但不能通過返回類型是否相同來判斷重載。
- 重載Overload是一個類中多態性的一種表現
- 重載要求同名方法的參數列表不同(參數類型,參數個數甚至是參數順序)
- 重載的時候,返回值類型可以相同也可以不相同。無法以返回型別作爲重載函數的區分標準