1. 程式人生 > 實用技巧 >Java重寫與過載的區別

Java重寫與過載的區別

1 重寫(Override)

  從字面上看,重寫就是 重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類並不想原封不動的繼承父類中的某個方法,所以在方法名,引數列表,返回型別(除非子類中方法的返回值是父類中方法返回值的子類時)都相同的情況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函式的訪問修飾許可權不能少於父類的。

  程式碼案例:
public class Father {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Son s = new Son();
        s.sayHello();
    }

    public void sayHello() {
        System.out.println("Hello");
    }
}

class Son extends Father{

    @Override
    public void sayHello() {
        // TODO Auto-generated method stub
        System.out.println("hello by ");
    }

}

  重寫總結:

  1. 發生在父類與子類之間
  2. 方法名,引數列表,返回型別(除非子類中方法的返回型別是父類中返回型別的子類)必須相同
  3. 訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
  4. 重寫方法一定不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常

2 過載(Overload)

  在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同甚至是引數順序不同)則視為過載。同時,過載對返回型別沒有要求,可以相同也可以不同,但不能通過返回型別是否相同來判斷過載

  程式碼案例:
public class Father {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Father s = new Father();
        s.sayHello();
        s.sayHello("wintershii");

    }

    public void sayHello() {
        System.out.println("Hello");
    }

    public void sayHello(String name) {
        System.out.println("Hello" + " " + name);
    }
}

  過載總結:

  1. 過載Overload是一個類中多型性的一種表現
  2. 過載要求同名方法的引數列表不同(引數型別,引數個數甚至是引數順序)
  3. 過載的時候,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準

面試時:過載(Overload)和重寫(Override)的區別?

  答:方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。

  • 過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;

  • 重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數列表,有相容的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常(里氏代換原則)。過載對返回型別沒有特殊的要求,不能根據返回型別進行區分。