java基礎之繼承
Java 繼承
- 清楚繼承的主要作用和相關限制。
- 繼承性的相關限制以及使用規則。
- 繼承的實現
class 子類 extends 父類 {}
子類又被成為派生類,父類也被稱為基類(超類),
子類可以繼承父類中的所有方法,實現程式碼重用,
子類可以拓展方法,在子類內部重新定義新的方法
- java不允許新的繼承
- 為了滿足一個子類繼承多個父類的需要,可以使用多層繼承。
例:多層繼承:
Class a{}
Class b extends a{}
Class c extends b{}
- 子類在繼承父類的時候,將會繼承父類中的全部操作。子類對父類中的私有操作屬於隱式繼承,非私有操作屬於顯示繼承。
例:
class A{
private String msg;
public void setMsg(){
this.msg = msg;
}
public void getMsg(){
return this.msg;
}
}
class B extends A{
public void fun(){
System.out.println(msg);
}
}
public class day08 {
public static void main(String args[]){
B b = new B();
b.setMsg("hello");
System.out.println(b.getMsg)
}
}
在以上程式中,主程式在例項化B之後,能夠呼叫A中的方法對A中的私有屬性msg進行賦值,但是,在子類B中卻不能輸出父類A中的私有屬性,
- 在子類物件構造之前一定會預設呼叫父類的構造(預設使用無參構造),以保證父類的物件先例項化,而後再例項化子類物件。如果父類中沒有無參構造方法,那麼就必須使用super()呼叫父類中的有參構造方法。
- super()與this()不能同時出現,子類物件的構造方呼叫之前一定先呼叫父類中的構造方法,為父類的物件初始化之後,才輪到子類初始化。
- 方法的覆寫
繼承性的主要特徵是子類可以根據父類已有的功能進行功能的拓展,但是在子類定義屬性或者方法的時候, 有可能與父類中的屬性或方法重名。在這種情況下,我們稱之為子類覆寫了父類的方法。
當子類定義了與父類方法名稱相同,引數的型別及個數 返回值相同的方法時,我們就成為發生了方法的覆寫。
覆寫的使用原則(被動):
如果發現父類中的方法名稱功能不足(不適合本子類),但是又必須使用這個方法名稱的時候,就必須要採用覆寫。
被子類所覆寫的方法不能夠擁有比父類更嚴格的訪問控制權限。
Super.方法()與this.方法()的區別:
- 使用“this.方法.()”會首先查詢本類中是否存在有要呼叫的方法名稱,如果存在則直接呼叫, 如果不存在,查詢父類中是否存在此方法,如果有就呼叫,如果沒有就會發生編譯時的錯誤。
- 使用“super.方法.()”,明確的表示呼叫的不是子類方法(不在子類中查詢是否存在該方法),而直接呼叫父類中的指定方法。
過載與覆寫的區別?
編號 |
區別 |
過載 |
覆寫 |
1 |
英文單詞 |
Overloading |
Overrider |
2 |
發生範圍 |
發生在一個類中 |
發生在繼承關係中 |
3 |
定義 |
方法名稱相同,引數的型別以及個數相同 |
方法名稱相同,引數的型別、個數相同,返回值相4同 |
4 |
許可權 |
沒有許可權限制 |
子類中被覆寫的方法不能擁有比父類更嚴格的訪問控制權限 |
在使用過載的時候,返回值能否不同?
在發生過載關係的時候,返回值型別可以不同。但是為了保護程式的統一性,過載時儘量保證方法返回值的統一性。
- 屬性的覆蓋
如果說現在子類定義了和父類完全相同的屬性名稱的時候,就成為屬性的覆蓋。
- 繼承關係中this與super的區別
Super.方法()與this.方法()的區別:
- 使用“this.方法.()”會首先查詢本類中是否存在有要呼叫的方法名稱,如果存在則直接呼叫, 如果不存在,查詢父類中是否存在此方法,如果有就呼叫,如果沒有就會發生編譯時的錯誤。
- 使用“super.方法.()”,明確的表示呼叫的不是子類方法(不在子類中查詢是否存在該方法),而直接呼叫父類中的指定方法。
編號 |
區別 |
this |
Super |
1 |
功能 |
呼叫本類中的方法、屬性 |
呼叫父類中的方法和屬性 |
2 |
形式 |
先查詢本類中是否存在指定的呼叫結構,如果有,就直接呼叫,如果沒有就在父類中呼叫 |
不查詢子類,直接在父類中呼叫 |
3 |
特殊 |
表示本類中的當前物件 |
不能單獨使用 |