1. 程式人生 > >Java方法過載(Over)與覆寫(重寫Override)

Java方法過載(Over)與覆寫(重寫Override)

方法過載

定義: 方法名相同,引數型別或個數不同、順序不同。與返回值無關!

每一個過載的方法(或者建構函式)都必須有一個獨一無二的引數型別列表。 最常用的地方就是構造器的過載 過載規則:

  • 被過載的方法必須改變引數列表(引數個數或者型別不一樣);
  • 被過載的方法可以改變返回型別;
  • 被過載的方法可以改變訪問修飾符;
  • 被過載的方法可以宣告新的或者更廣的檢查異常;
  • 方法能夠在同一類中或者在一個子類中被過載
  • 過載函式的返回值型別一定保持相同!

方法覆寫(重寫)

首先覆寫的定義是:如果子類定義了與父類完全相同(不算許可權)的方法或者屬性的時候,這樣的操作就稱為覆寫。 方法覆寫定義: 子類定義了與父類方法名稱、引數列表、返回值完全相同的方法。被覆寫的方法不能擁有比父類更為嚴格的訪問控制權限。 例如:

class Person{
    public void Parent(){
        System.out.println("hahah ");
    }

}

class Student extends Person{
    public void Parent(){
        System.out.println("heheh");
    }
    
}

public class Test{
    public static void main(String[] args){
        new Student().Parent();
    }
   
}

執行結果:

heheh

進行覆寫操作的時候注意以下兩點:

1.你當前使用的物件是通過哪個類new的。 2.使用子類物件呼叫某個方法,如果該方法已經被子類所覆寫了,那麼呼叫的一定是被覆寫過的方法。

在進行方法覆寫的時候,有明確的要求:被覆寫不能擁有比父類更為嚴格的訪問控制權限。 private<default(啥也不寫) - 包訪問許可權,在同一個原始檔中的訪問許可權 < public.也就是說如果父類使用public進行方法宣告,那麼子類必須也使用public;如果父類使用default,那麼子類可以使用default或者public。 錯誤的覆寫:

class Person{
    public void Parent(){
        System.out.println("hahah ");
    }

}

class Student extends Person{
    void Parent(){
        System.out.println("heheh");
    }
    
}

public class Test{
    public static void main(String[] args){
        new Person().Parent();
    }
   
}

執行結果:

Test.java:199: 錯誤: Student中的Parent()無法覆蓋Person中的Parent()
    void Parent(){
         ^
  正在嘗試分配更低的訪問許可權; 以前為public
1 個錯誤

思考題:如果現在父類方法使用了private定義,子類中使用public覆寫,對嗎?

如果現在父類方法使用了private定義,那麼就表示該方法只能被父類使用,子類無法使用。也就是子類根本就不知道父類有這樣的方法。 如果子類中使用public對上述父類方法進行重寫,那麼這個方法就只是子類定義的新方法而已,並沒有和父類的方法有任何關係。

方法重寫的規則:

  • 外部框架(引數列表,返回值,函式名)必須完全與被重寫方法相同。
  • 訪問許可權不能比父類中被重寫的方法的訪問許可權更低。
  • 父類的成員方法只能被它的子類重寫。
  • 宣告為final的方法不能被重寫
  • 宣告為Static的方法不能被重寫,但是能夠被再次宣告(public static 方法返回值 方法名稱([引數型別 變數…]))。
  • 子類和父類在同一個包中,那麼子類可以覆寫父類所有方法,除了宣告為private和final的方法。
  • 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。
  • 構造方法不能被重寫 方法過載和覆寫的區別

在這裡插入圖片描述

總結:

  1. 方法過載是一個類中定義了多個方法名相同,而引數的數量或型別或次序不同,則成為方法的過載
  2. 方法的覆寫(重寫)是在子類存在方法與父類的方法的名字相同,並且引數的個數與型別一樣,返回值也一樣的方法,就稱為覆寫
  3. 方法過載和覆寫是java多型型的不同表現,方法過載是一個類的多型型表現,而方法重寫是子類與父類的一種多型性表現。