重寫(Override)
比如,
定義Father類
1:姓名,吃飯方法,吃窩窩頭。
2:定義Son類,繼承Father
1:Son類中不定義任何成員,子類創建對象,仍然可以調用吃飯的方法。
2:父類的吃飯的方法,Son不願吃。Son自己定義了吃飯的方法。
1:此時父類中有一個吃飯的方法,子類中有2個吃飯的方法,一模一樣,只是方法體不一樣。
2:一個類中兩個函數一模一樣,是不允許的。
1:編譯運行,執行了子類的方法。
2:使用父類的方法,在子類方法中,使用super.父類方法名。
class Father {
String name;
void eat() {
System.out.println("吃窩窩");
}
}
class Son extends Father {
public void eat() { // 繼承可以使得子類增強父類的方法
System.out.println("來倆小菜");
System.out.println("來兩杯");
System.out.println("吃香喝辣");
System.out.println("來一根");
}
}
class Demo8 {
public static void main(String[] args) {
Son s = new Son();
//執行子類的方法
s.eat();
}
}
3,該現象就叫做重寫(覆蓋 override)
1,在繼承 中,子類可以定義和父類相同的名稱並且參數列表一致的函數,將這種函數稱之爲函數的重寫
4,前提
1,必須存在有繼承關係
5,特點
1,當子類重寫了父類的函數,那麼子類的對象如果調用該函數,一定調用的是重寫過後的函數,可以通過super關鍵字進行父類的重寫函數的調用
2,繼承可以使得子類增強父類的方法
6,細節
1,函數名必須相同
2,參數列表必須相同
3,子類重寫父類的函數的時候,函數的訪問權限必須大於等於父類的函數的訪問權限否則會編譯報錯
4,子類重寫父類的函數的時候,返回值類型必須是父類函數的返回值類型或該返回值類型的子類,不能返回比父類更大的數據類型,如子類函數的返回值類型是object
1:定義 A B C類 B extends A
2:Father類中定義A getA();
3:Son 類中重寫getA(); 方法,嘗試將返回值修改爲B,C ,Object
1:B編譯通過
2:C 編譯失敗 ,沒有繼承關係
3:Object編譯失敗,比父類的返回值類型更大
class A {
}
class B extends A {
}
class C {
}
class Father {
String name;
void eat() {
System.out.println("吃窩窩");
}
// 定義一個函數,獲取A類的對象,
A getA() {
return new A();
}
}
class Son extends Father {
public void eat() { // 繼承可以使得子類增強父類的方法
System.out.println("來兩杯");
System.out.println("來倆小菜");
super.eat();
System.out.println("來一根");
}
// B類是A類的子類
B getA() {
return new B();
}
}
class Demo8 {
public static void main(String[] args) {
Son s = new Son();
s.eat();
}
}
7,子類對象查找屬性或方法時順序
1,原則,就近原則
如過子類的對象調用方法,默認先使用this進行查找,如果當前對象沒有找到屬性或方法,把當前對象中維護的super關鍵字指向的對象,如果還沒有找到變異報錯,找到直接調用,
8,重載和重寫的不同
1,重載(overload)
1,前提,所有的重載函數都必須在同一個類中
2,特點
函數名相同,參數列表不同,與其他的無關(訪問控制符,返回值類型)
3,不同
個數不同、順序不同、類型不同
2,重寫(override)
1,前提,繼承
2,特點
函數名必須相同,參數列表必須相同
子類的返回值類型要等於或者小於父類的返回值