Java的方法重載、方法覆寫及二者的差異

一、方法重載(overloading)

1.概念

  • 方法的重載是同類中同名方法共存的情況。爲了調用時能明確需要執行的是哪個方法,重載時需要參數列表來區別不同的方法。
  • 參數列表不同:不同方法的參數必須不同,或參數個數不同,或參數類型不同,或參數順序不同。
  • 注:不能有兩個名字相同,參數類型也相同,但返回值不同的方法。
  • 返回類型不能用來區分重載的方法

2.舉例

public class OverloadingDemo {
    public static void main(String[] args) {
        System.out.println(add(5,5));
        System.out.println(add(5,5,55));
    }
    public static int add(int x,int y){
        return x+y;
    }
    public static int add(int x,int y,int z){
        return x+y+z; }
}

輸出:

10
65

二、方法覆寫(override)

1.相關概念

  • 方法的覆寫:使用相同的方法名及參數表,但執行不同的功能。
  • 當子類定義了與父類方法名稱相同,參數類型以及個數完全相同的時候,就稱爲方法的覆寫。

2.舉例

2.1方法未被覆寫

public class OverrideDemo {
   public static class Father {
        public void print() {
            System.out.println("sunny day");
        }
    }
   public static class Kid extends Father {
    }
    public static void main(String args[]) {
        Kid kid = new Kid();
        kid.print(); // 方法從父類繼承而來
    }
}

輸出:

sunny day

2.2方法被覆寫

public class OverrideDemo {
   public static class Father {
        public void print() {
            System.out.println("sunny day");
        }
    }
   public static class Kid extends Father {
        public void print() {
            System.out.println("豔陽天");
        }
    }
    public static void main(String args[]) {
        Kid kid = new Kid();
        kid.print(); // 方法從父類繼承而來
    }
}

輸出:

豔陽天

  • 現在實例化的是子類對象,此時所調用的方法一定是被子類所覆寫過的方法,如果該方法沒有被覆寫過(如2.1),那麼將調用父類中提供的方法,覆寫的意義在於優化父類的功能。(轉)

2.3繼續調用父類方法

  • 在子類進行方法覆寫之後如果要想繼續調用父類中的方法,那麼就必須使用"super.方法()"
public class OverrideDemo {
   public static class Father {
        public void print() {
            System.out.println("sunny day");
        }
    }
   public static class Kid extends Father {
        public void print() {
            super.print();
            System.out.println("豔陽天");
        }
    }
    public static void main(String args[]) {
        Kid kid = new Kid();
        kid.print(); // 方法從父類繼承而來
    }
}

輸出:

sunny day
豔陽天

注:

  • this.方法():先從本類查找是否存在指定的方法,如果沒有找到,則調用父類操作;
  • super.方法():直接由子類調用父類之中的指定方法,不再找子類。(轉)

2.4方法覆寫的限制

  • 被覆寫的方法不能比父類方法的訪問權限更嚴格。
  • 但要注意的是:父類方法的權限不能爲private,若是則子類將無法訪問父類的方法,從而無法覆寫父類方法,相當於子類重新定義了一個與父類重名的方法。

三、二者的區別

方法重載 方法覆寫
名稱 overloading override
定義 方法名稱相同,參數列表不同 方法名稱、參數列表、返回值都相同
範圍 一個類 繼承關係
權限 無過多要求 被覆寫的方法不能比父類方法的訪問權限更嚴格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章