1、重載(overload)和覆蓋(override)是java多態性的兩種不同表現方式
覆蓋(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding) 。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被屏蔽了。
2、如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載(Overloading)。不能通過訪問權限、返回類型、拋出的異常進行重載。重載overload的特點就是與返回值無關,只看參數列表,所以重載的方法是可以改變返回值類型的。
1. Overload 特點
-
1、重載時通過不同的參數樣式來區分。例如,不同的參數類型,不同的參數個數,不同的參數順序)
-
2、不能通過方法法人訪問權限、返回類型、拋出的異常進行重載;
-
3、方法的異常類型和數目不會對重載造成影響;
-
4、對於繼承來說,如果基類方法的訪問權限為private,那么就不能再派生類中進行重載,只是一個新的方法而已。
2. Override 特點
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、方法被定義為final不能被重寫;
5、對於繼承來說,如果某一方法在父類中是訪問權限是private,那么就不能在子類對其進行重寫 覆蓋,如果定義的話,也只是定義了一個新方法,而不會達到重寫覆蓋的效果。(通常存在於父類和 子類之間。)
3. 重載(overload)和覆蓋(override)主要區別:
1)覆蓋是子類和父類之間的關系,是垂直關系;重載是同一個類中多個方法的聯系屬於水平的關系;
2)覆蓋只能由一個方法或一對方法產生關系,重載是多個方法之間的聯系;
3)覆蓋要求參數列表相同;重載要求參數列表不同;
4)覆蓋關系中,調用方法體是根據對象的類型(對象對應存儲空間決定的);而重載是根據調用時的實參表與形參表來選擇方法體的。
區別點 | 覆蓋 | 重載 |
---|---|---|
參數列表 | 必須不同 | 必須相同 |
返回類型 | 無限制 | 必須相同 |
異常 | 可以修改 | 異常只能減少或刪除 |
訪問權限 | 可以修改 | 不可以降低方法的訪問權限 |
重載實例
class MyClass {
int height;
MyClass() {
System.out.println("調用無參數構造函數");
height = 4;
}
MyClass(int i) {
System.out.println("調用有參數構造函數");
height = i;
}
void info(int a, String s) {
System.out.println(s+":房子高度為 "+height + " 米");
}
void info(String s, int a) {
System.out.println("參數順序不同構成重載:" +s + ": 房子高度為 " + height + " 米");
}
int info(int b, int a) {
System.out.println("方法修飾符可以不同" +": 房子高度為 " + height + " 米");
return a+b;
}
float info(int b, int a, float c) {
System.out.println("方法返回值類型可以不同" +": 房子高度為 " + height + " 米");
return a+b;
}
}
public class Ytt {
public static void main(String[] args) {
MyClass t = new MyClass(3);
t.info(1,"測試1");
t.info("測試2",2); //參數順序不同構成重載
t.info(1,2); //方法修飾符可以不同,方法返回值類型不影響重載
t.info(1,2,6f); //方法返回值類型可以不同
//重載構造函數
new MyClass();
}
}
重寫實例
class MyClass {
void info(String s) {
System.out.println("我是父類:"+s);
}
}
class MyClassRoom extends MyClass{
void info(String s) {
System.out.println("我是子類:"+s);
}
int info(String s,int c) {
System.out.println("我是子類:"+s);
return c;
}
}
public class Ytt {
public static void main(String[] args) {
MyClass t = new MyClass();
t.info("測試1");
MyClassRoom r = new MyClassRoom ();
r.info("測試2"); //方法覆蓋
r.info("測試3",3); //不屬於方法覆蓋;嚴格意義上說,方法重載發生在一個類內部,因此也不屬於方法重載。
}
}