1. 程式人生 > >【java】方法的過載和覆蓋

【java】方法的過載和覆蓋

方法過載和方法覆蓋的區別:
方法過載:Overload
方法覆蓋:Override
兩者本身一點關係都沒有,僅僅只是因為名字很像。

方法過載:Overload
作用:解決了同一個類中,相同的功能方法名不同的問題,既然是相同的功能,那麼方法的名字就應該相同
規則:(兩同一不同)
同類中,方法名相同,方法引數列表不同(引數型別、引數個數、引數順序)

方法覆蓋:Override
作用:解決子類繼承父類之後,可能父類的某一個方法不滿足子類的具體特徵,此時需要重新在子類中定義該方法,並重寫方法體。

方法覆蓋:當子類拓展了父類,可以獲得父類的部分方法和成員變數。可是當父類的某個方法不適合子類本身的特徵時,此時子類需要重新定義父類的方法,並重寫方法體,這就叫方法覆蓋(Override)

方法覆蓋(override)
在類繼承中,子類可以修改從父類繼承來的行為,也就是說子類能建立一個與父類方法有不同功能的方法,但具有相同的:名稱、 返回型別、 引數列表。
方法覆蓋的原則
覆蓋方法必須和父類中被覆蓋方法具有相同的方法名稱、輸入引數和返回值型別。
覆蓋方法不能使用比父類中被覆蓋方法更嚴格的訪問許可權。
覆蓋方法不能比父類中被覆蓋方法丟擲更多的異常

方法的過載
在同一個 Java 類中,如果出現了方法名稱相同,而引數列表不同的情況就叫做過載(overload) 。
例如:
public void println(int i);
public void println(char c);
public void println(String s);
過載的方法必須有不同的引數列表
引數型別不同;
引數個數不同;

覆蓋和過載比較

過載方法: 在一個類中用相同的名字建立多個方法(每個方法的引數表不同)

方法覆蓋: 在一個類中建立的方法與父類中方法的名字、 返回型別和引數表相同,覆蓋是針對兩個類說的,而且必須是子類(或孫類,孫孫類等)覆蓋掉父類的方法

構造器的過載
除了方法外,類的構造器也可以實現過載
類的構造器可以相互呼叫,呼叫方式是使用this關鍵字來實現

程式碼:

public class Employee {
    String name;
    int salary;
    public String getDetails() {
      return " Name: "+ name+ " \n "
+ "Salary: "+ salary; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
public class Manager extends Employee {
     String department;
/**
* 方法的覆蓋
*/
     public String getDetails() {
        return " Name: "+ name+ " \n "+ " Manager of "+department;
}
     public void test()
 {
 //呼叫父類的方法,怎麼辦?
       System.out.println(super.getDetails());
 }
     public static void main(String []args){
        Manager m=new Manager();
        System.out.println( m.getDetails());
   }
}


class A {
 protected int method1(int a, int b) { return 0; }
}
public class B extends A{ 
 public int method1(int a, int b) { return 0; } //正確,重寫父類方法,可以擴大訪問許可權
 //private int method1(int a, int b) { return 0; } //錯誤,重寫父類方法,不能降低了訪問許可權
 //private long method1(int a, int b) { return 0; } //錯誤,重寫父類方法,不能改變返回值型別
 public short method1(int a, long b) { return 0; }//正確,過載自身的方法,可以有不同的訪問許可權和返回值型別
 private int method1(int a, long b) { return 0; }//正確,過載自身的方法,可以有不同的訪問許可權和返回值型別
}