Java千百問_05面向對象(008)_java中覆蓋是什麽
阿新 • • 發佈:2017-08-19
返回 類變量 默認 public -m view ati 面向對象 text
點擊進入_很多其它_Java千百問
1、什麽是覆蓋
在java中,覆蓋是針對繼承才有的概念,某一個子類須要某些方法或屬性,但又不想使用父類中的同名的方法或屬性,就須要使用覆蓋。
直白的來說,就是在子類中編寫與父類同名、同參數、同返回值的方法,或同名、同類型的屬性。子類對象調用該方法/屬性時。運行的是子類的方法。而不會運行父類的方法(除非在方法第一行寫super();會先運行父類方法。再繼續運行子類代碼。
)
了解類的構造函數看這裏:類、對象究竟有什麽秘密
了解很多其它繼承看這裏:java類的繼承有什麽意義
2、構造函數怎樣覆蓋
了解類的構造函數看這裏:類、對象究竟有什麽秘密
當子類繼承一個父類時,構造子類時須要調用父類的構造函數,存在三種情況
- 父類無構造函數或者一個無參數構造函數時。子類若無構造函數或者有無參數構造函數。子類構造函數中不須要顯式調用父類的構造函數,系統會自己主動在調用子類構造函數前調用父類的構造函數。
- 父類僅僅有有參數構造函數時。
子類在構造方法中必須要顯示調用父類的構造函數,否則編譯出錯。
- 父類既有無參數構造函數,也有有參構造函數。
子類能夠不在構造方法中調用父類的構造函數,這時使用的是父類的無參數構造函數。
3、方法怎樣覆蓋
- 子類覆蓋父類的方法,必須有相同的參數和返回類型。
- 子類覆蓋父類的方法,在jdk1.5後。參數、返回類型能夠是父類方法返回類的子類。
- 子類覆蓋父類的方法,能夠改動方法的修飾符。但僅僅能把方法的作用域放大。而不能把public改動為private。
了解很多其它java修飾符看這裏:public、privite、protected有什麽差別 - 子類方法能夠訪問父類的protected屬性。但不能夠訪問默認的屬性。
- 子類的靜態方法。與父類同名靜態方法互不影響。因為靜態方法使用類名調用,使用子類類名調用子類的方法。使用父類類名調用父類的方法。
- 多態時,當子類覆蓋了父類的方法,使用子類覆蓋的方法。
了解什麽是多態:[java的多態性都有什麽表現][6]
[6]:
4、屬性怎樣覆蓋
- 當子類覆蓋父類的實例變量時。父類方法使用的是父類的實例變量,子類方法使用的是子類的實例變量。
- 子類或父類使用實例變量時,都相當於在前面加了一個this指針
了解很多其它java變量看這裏:局部變量、類變量、實例變量有什麽差別
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
Java千百問_05面向對象(008)_java中覆蓋是什麽