原作者: Erik明
原博客鏈接:重寫、覆蓋、重載、多態幾個概念的區別分析
override->重寫(=覆蓋)、overload->重載、polymorphism -> 多態
override是重寫(覆蓋)了一個方法,以實現不同的功能。一般是用于子類在繼承父類時,重寫(重新實現)父類中的方法。
重寫(覆蓋)的規則:
- 重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載.
- 重寫方法的訪問修飾符一定要大于被重寫方法的訪問修飾符(public>protected>default>private)。
- 重寫的方法的返回值必須和被重寫的方法的返回值一致;
- 重寫的方法所拋出的異常必須和被重寫方法所拋出的異常一致,或者是其子類;
- 被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行重寫。
- 靜態方法不能被重寫為非靜態的方法(會編譯出錯)。
overload是重載,一般是用于在一個類內實現若干重載的方法,這些方法的名稱相同而參數形式不同。
重載的規則:
- 在使用重載時只能通過相同的方法名、不同的參數形式實現。不同的參數形式可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣);
- 不能通過訪問權限、返回類型、拋出異常進行重載;
- 方法的異常類型和數目不會對重載造成影響;
多態的概念比較復雜,有多種意義的多態,一個有趣但不嚴謹的說法是:繼承是子類使用父類的方法,多態則是父類使用子類的方法。
一般,我們使用多態是為了避免父類里大量重載引起代碼臃腫且難于維護。
public class Shape {
public static void main(String[] args){
Triangle tri = new Triangle();
System.out.println("Triangle is a type of shape? " + tri.isShape());// 繼承
Shape shape = new Triangle();
System.out.println("My shape has " + shape.getSides() + " sides."); // 多態
Rectangle Rec = new Rectangle();
Shape shape2 = Rec;
System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //重載
}
public boolean isShape(){
return true;
}
public int getSides(){
return 0 ;
}
public int getSides(Triangle tri){ //重載
return 3 ;
}
public int getSides(Rectangle rec){ //重載
return 4 ;
}
}
class Triangle extends Shape
{
public int getSides() { //重寫,實現多態
return 3;
}
}
class Rectangle extends Shape
{
public int getSides(int i) { //重載
return i;
}
}
注意Triangle類的方法是重寫,而Rectangle類的方法是重載。對兩者比較,可以發現多態對重載的優點:
如果用重載,則在父類里對應每一個子類都重載一個取得邊數的方法;
如果用多態,則父類只提供取得邊數的接口,至于取得哪個形狀的邊數,怎樣取得,在子類里各自實現(重寫)。