一、方法重載(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 |
定義 | 方法名稱相同,參數列表不同 | 方法名稱、參數列表、返回值都相同 |
範圍 | 一個類 | 繼承關係 |
權限 | 無過多要求 | 被覆寫的方法不能比父類方法的訪問權限更嚴格 |