Java千百問_05面向物件(008)_java中覆蓋是什麼
阿新 • • 發佈:2019-02-07
1、什麼是覆蓋
在java中,覆蓋是針對繼承才有的概念,某一個子類需要某些方法或屬性,但又不想使用父類中的同名的方法或屬性,就需要使用覆蓋。
直白的來說,就是在子類中編寫與父類同名、同參數、同返回值的方法,或同名、同類型的屬性,子類物件呼叫該方法/屬性時,執行的是子類的方法,而不會執行父類的方法(除非在方法第一行寫super();會先執行父類方法,再繼續執行子類程式碼。)
2、建構函式如何覆蓋
瞭解類的建構函式看這裡:類、物件到底有什麼祕密
當子類繼承一個父類時,構造子類時需要呼叫父類的建構函式,存在三種情況
- 父類無建構函式或者一個無引數建構函式時。子類若無建構函式或者有無引數建構函式,子類建構函式中不需要顯式呼叫父類的建構函式,系統會自動在呼叫子類建構函式前呼叫父類的建構函式。
- 父類只有有引數建構函式時。子類在構造方法中必須要顯示呼叫父類的建構函式,否則編譯出錯。
- 父類既有無引數建構函式,也有有參建構函式。子類可以不在構造方法中呼叫父類的建構函式,這時使用的是父類的無引數建構函式。
3、方法如何覆蓋
- 子類覆蓋父類的方法,必須有同樣的引數和返回型別。
- 子類覆蓋父類的方法,在jdk1.5後,引數、返回型別可以是父類方法返回類的子類。
- 子類覆蓋父類的方法,可以修改方法的修飾符,但只能把方法的作用域放大,而不能把public修改為private。
瞭解更多java修飾符看這裡:public、privite、protected有什麼區別 - 子類方法能夠訪問父類的protected屬性
- 子類的靜態方法,與父類同名靜態方法互不影響。由於靜態方法使用類名呼叫,使用子類類名呼叫子類的方法,使用父類類名呼叫父類的方法。
- 多型時,當子類覆蓋了父類的方法,使用子類覆蓋的方法。
瞭解什麼是多型:[java的多型性都有什麼表現][6]
[6]:
4、屬性如何覆蓋
- 當子類覆蓋父類的例項變數時,父類方法使用的是父類的例項變數,子類方法使用的是子類的例項變數。
- 子類或父類使用例項變數時,都相當於在前面加了一個this指標(this.)。
5、例項
class SuperClass {
private int number;
public SuperClass() {
this.number = 0;
}
public SuperClass(int number) {
this.number = number;
}
public int getNumber() {
number++;
return number;
}
}
class SubClass1 extends SuperClass {
public SubClass1(int number) {
super(number);
}
}
class SubClass2 extends SuperClass {
private int number;
public SubClass2(int number) {
super(number);
}
}
public class SubClass extends SuperClass {
private int number;
public SubClass(int number) {
super(number);
}
public int getNumber() {
number++;
return number;
}
public static void main(String[] args) {
SuperClass s = new SubClass(20);
SuperClass s1 = new SubClass1(20);
SuperClass s2 = new SubClass2(20);
System.out.println(s.getNumber());
System.out.println(s1.getNumber());
System.out.println(s2.getNumber());
//結論一:多型時,當子類覆蓋了父類的方法,使用子類覆蓋的方法
//結論二:當子類覆蓋父類的例項變數時,父類方法使用的是父類的 例項變數,子類方法使用的是子類的例項變數
}
}
輸出結果:
1
21
21