Java繼承(上)
特點:
1.利於程式碼複用
2.縮短開發週期
-
一種類與類之間的關係
-
使用已存在的類的定義作為基礎建立新類
-
新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類
繼承的關係
滿足“A is a B”的關係就可以形成繼承關係
繼承的實現
通過extends關鍵字實現
例:
編寫父類
class Animal{ //公共的屬性和方法 }
編寫子類,繼承父類
class Dog extends Animal{ //子類特有的屬性和方法 } class Cat extends Animal{ ... }
子類可以直接訪問父類的非私有成員
父類不可以訪問子類的特有成員(公有的也不行)
方法重寫
方法重寫與方法過載的區別:
方法過載:
1.在同一個類中
2.方法名相同,引數列表不同(順序、個數、型別)
3.方法返回值、訪問修飾符任意
4.與方法的引數名無關
方法重寫:
1.在有繼承關係的子類中
2.如下
-
方法名
-
引數型別、順序、個數
都要與父類繼承的方法完全相同,方法返回值型別可以是父類的子類(即返回值型別與父類相容)
3.訪問修飾符允許改變,但訪問範圍需要大於等於父類的訪問範圍
4.與方法引數名無關
當子類重寫父類方法後,子類物件呼叫的是重寫後的方法
子類中可以定義與父類重名的屬性,子類物件呼叫時會呼叫子類中的重名屬性
訪問修飾符
-
公有的:public :允許在任意位置訪問
-
私有的:private:只允許在本類中進行訪問
-
受保護的:protected:允許當前類、同包子類/非子類、跨包子類呼叫;跨包非子類不允許
-
預設:允許在當前類、同包子類/非子類呼叫:跨包子類不允許
訪問修飾符 | 本類 | 同包 | 子類 | 其他 |
---|---|---|---|---|
private | √ | |||
預設 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
super關鍵字的使用
super:父類物件的引用
父類的構造不允許被繼承和重寫
子類構造預設呼叫父類的無參構造方法
可以通過super()呼叫父類允許訪問的其他構造方法(直接在super的括號里加引數即可)
通過super呼叫父類其他構造方法時,super()必須放在子類構造方法有效程式碼的第一行
總結:
-
代表父類引用
1.訪問父類成員方法——super.print();
2.訪問父類屬性——super.name;
3.訪問父類構造方法——super();
-
子類的構造過程中必須呼叫其父類的構造方法
-
如果子類的構造方法中沒有顯式標註,則系統預設呼叫父類的無參構造方法
-
如果子類的構造方法中既沒有顯式標註,且父類中沒有無參構造方法,則編譯出錯
繼承後的初始化順序
1.父類靜態成員
2.子類靜態成員
3.父類物件構造
4.子類物件構造
訪問修飾符不影響成員載入順序,跟書寫位置有關
this和super
都不能在靜態方法中被呼叫
this呼叫本類的構造方法,super呼叫父類的構造方法
構造方法呼叫時都必須放在第一行
this和super不能共存
總結
this:當前類物件的引用
1.訪問當前類的成員方法
2.訪問當前類的成員屬性
3.訪問當前類的構造方法
4.不能在靜態方法中使用
super:父類物件的引用
1.訪問父類的成員方法
2.訪問父類的成員屬性
3.訪問父類的構造方法
4.不能在靜態方法中使用