java中什麼是重寫(舉例說明)
重寫(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,特點
函式名必須相同,引數列表必須相同
子類的返回值型別要等於或者小於父類的返回值