繼承使用繼承優化設計使用:將重覆的代碼抽取到父類中繼承的優點和實現優點:方便修改代碼減少代碼量 子類和父類關係是is-a的關係(可以有多個子類,但只能有一個父類) 如何使用繼承?class Pet {/公共的屬性和方法}class Dog extends Pet {/子類特有的屬性和方法}class ...
繼承
使用繼承優化設計
使用:
將重覆的代碼抽取到父類中
繼承的優點和實現
優點:
方便修改代碼
減少代碼量
子類和父類關係是is-a的關係(可以有多個子類,但只能有一個父類)
如何使用繼承?
class Pet {
/公共的屬性和方法
}
class Dog extends Pet {
/子類特有的屬性和方法
}
class Penguin extends Pet {
}
//extends:繼承關鍵字
//一個子類只能繼承一個父類
理解繼承
子類訪問父類成員使用super關鍵字,訪問父類構造方法。super代表父類對象
super();調用父類無參構造方法
super(name);調用父類無有參構造方法
在子類構造方法中調用且必須是第一句訪問父類屬性
super.name;
訪問父類方法
super.print();
繼承下構造方法的執行過程
可以用構造方法為屬性賦值
當我們實例化子類無參構造時父類沒有自定義構造 系統會自動分配一個無參構造
實例化子類對象預設會先執行父類的構造,在執行子類的構造
super();預設調用父類的無參數構造
註意細節:必須是子類中在構造方法的第一條語句
(無參構造會預設調用)
super(參數列表);調用父類中的有參構造
使用super(參數列表);重覆調用父類中的有參構造,預設直接調用父類中的有參數構造,而不會調用父類中的無參數構造
註意:
實例化子類對象時,子類相應的構造,第一行調用父類的哪個構造,就執行哪一個父類構造,,如果沒有聲明父類構造,預設皆父類的無參構造
子類可以繼承父類的哪些資源?
private 不可被繼承
子類與父類不在同包,使用預設訪問許可權的成員不可被繼承(預設 友好的 friendly)
構造方法不被繼承必須使用super進行訪問
論訪問修飾符 protected (受保護的):
可以修飾屬性和方法
本類,同包,子類可以訪問(子類跨包也可以訪問)
多重繼承關係的初始化順序?
父類屬性>父類構造方法>子類屬性>子類構造方法
何時使用繼承?
繼承與真實世界類似
繼承最大的特點是:代碼重用(的一種方式)
將子類共有的屬性和方法都放在父類當中
構造方法不能被繼承,因此不能重寫
方法重寫的規則:
方法名相同
參數列表相同
返回值類型相同或者是其子類
訪問許可權不能嚴於子類
方法重載與方法重寫:
方法重寫:位置在子類,方法名相同,參數表相同,返回值相同或是其子類i,訪問修飾符不能比父類更嚴格
方法重載:位置在同類,方法名相同,返回值無關,訪問修飾符無關
super關鍵字來訪問父類的成員
super只能出現在子類方法和構造方法中
super調用構造方法時,只能是第一句
super不能訪問父類的private成員
廢話不多說,上慄子:
package cn.jbit.epet.inherit2; /** * 狗狗類,寵物的子類。 * @author 北大青鳥 */ public class Dog extends Pet { private String strain;// 品種 /** * 有參構造方法。 * @param name 昵稱 * @param strain 品種 */ public Dog(String name, String strain) { super(name); //此處不能使用this.name=name; this.strain = strain; } public void setStrain(String strain) { this.strain = strain; } public String getStrain() { return strain; } public void print(){ super.print(); System.out.println("我是一隻"+this.getStrain()+"犬。"); } }狗狗類
package cn.jbit.epet.inherit2; /** * 企鵝類,寵物的子類。 * @author 北大青鳥 */ public class Penguin extends Pet { private String sex;// 性別 /** * 有參構造方法。 * @param name 昵稱 * @param sex 性別 */ public Penguin(String name, String sex) { super(name); this.sex = sex; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public void print(){ super.print(); System.out.println("我的性別是"+this.getSex()+"。"); } }企鵝類
package cn.jbit.epet.inherit2; /** * 寵物類,狗狗和企鵝的父類。 * @author 北大青鳥 */ public class Pet { private String name = "無名氏";// 昵稱 private int health = 100;// 健康值 private int love = 0;// 親密度 /** * 無參構造方法。 */ public Pet() { this.health = 95; System.out.println("執行寵物的無參構造方法。"); } /** * 有參構造方法。 * @param name 昵稱 */ public Pet(String name) { this.name = name; } public String getName() { return name; } public int getHealth() { return health; } public int getLove() { return love; } /** * 輸出寵物信息。 */ public void print() { System.out.println("寵物的自白:\n我的名字叫" + this.name + ",我的健康值是" + this.health + ",我和主人的親密程度是" + this.love + "。"); } }父類
package cn.jbit.epet.inherit2; /** * 測試類,測試類的繼承。 * @author 北大青鳥 */ public class Test { public static void main(String[] args) { // 1、創建寵物對象pet並輸出信息 Pet pet = new Pet("貝貝"); //pet.print(); // 2、創建狗狗對象dog並輸出信息 Dog dog = new Dog("歐歐", "雪娜瑞"); dog.print(); // 3、創建企鵝對象pgn並輸出信息 Penguin pgn = new Penguin("楠楠", "Q妹"); pgn.print(); } }測試類