1,繼承
次級類會繼承上級類的方法,也就是說子類自動獲得父類的功能。 子類中可以選擇覆蓋父類的方法以適應相應需求
實例變量無法被覆蓋掉是因爲不需要, 它們並沒有被定義成特殊的行爲
繼承的實例
public class Doctor{
boolean worksAtHospital;
void treatPatient(){}
}
public class FamilyDoctor extends Doctor{
boolean makeHouseCalls;
void giveAdvice(){ //給出診斷 }
}
public class Surgeon extends Doctor{
void treatPatient(){}
void makeIncision(){}
}
Surgeon 有一個實例變量
FamilyDoctor 有兩個實例變量
Doctor 有一個方法
Surgenon 有三個方法
FamilyDoctor 有兩個方法
一,java子類可以繼承父類所有的屬性變量。private也能被繼承但是不能被訪問;可以通過public的Setter與Getter方法在父類調用。
二,子類繼承父類時,需要注意以下三點:
1、在子類繼承父類的時候,子類必須調用父類的構造函數。
2、如果父類有默認構造函數,子類實例化時自動調用,但如果父類沒有默認構造函數,即無形參構造函數,子類構造函數必須通過super調用父類的構造函數。
3、在java的繼承當中子類是不可以繼承父類的構造函數,只能調用父類的構造函數。
2.設計繼承
1.找出具有共同行爲和屬性的對象(即類和方法)
2.設計代表共同行爲狀態的類
3.決定子類是否需要覆蓋父類的方法
4.通過尋找使用共同行爲的子類來找出更多抽象化的機會
5.完成類的繼承層次
子類可以擴充父類的方法 例
void run() {
super.run();
//add other action
}
IS——A 測試來輔助完成繼承的設計
當調用對象的引用方法時,你會調用到與該對象繼承層次最接近的方法
3.繼承的意義
減少了重複代碼, 提高了可維護性 某些情況下可以只動父型就可以完成項目需求的修改
規定了一份合約,便於多態的實現(當你定義一組父型時,你可以用子型的任何類來填補父型的位置)
4.多態
運用多態的例子
Animal [] animals = new Animal[4];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Worf();
animals[3] = new Taiger();
for( int i=0; i < animals.length; i++){
animals[i].eat(); //會調用不同的動物自己獨特的的喫的方式
}
參數和返回類型也可以多態
class Vet{
public void giveShot( Animal a ){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v = new Vet;
Dog d = new Dog();
Hippo h = new Hippo();
v.giveShot( d ); //會執行Dog的makeNoise
v.giveShot( h ); //會執行Hippo的makeNoise
}
}
關於繼承的思考
1.可以通過繼承來覆蓋設計不好的類, 用新的方法來覆蓋之前父類不適宜的方法
2.控制類防止被繼承的方法 一.權限控制(設定爲private 或者默認權限) 二.使用final修飾的類不能被繼承(是爲了確保方法都是自己所寫的版本)三.讓類的構造函數私有(private)
3.可以只用final來標識類中的方法而不標識整個類 這樣就可以防止方法被覆蓋(不想方法被覆蓋時)
5.覆蓋的規則
編譯器會尋找引用類型的來決定你是否可以調用該引用的特定方法,但在執行期間Java虛擬機尋找的是存在堆上的對象
參數必須一樣,返回類型要兼容
不能降低方法的存取權限(權限必須相同或者更高)
6.方法的重載
方法的重載
意義是方法的名稱相同但是參數不同所以,重載和多態毫無關係
重載可以有一個方法的不同參數版本
1.重載的返回類型可以不同
2.不能只改變返回類型
3.可以更改存取權限