重寫只存在於子類與父類中,重載存在於一個類中。
具體區別如下:
一、重寫(override)
override是重寫(覆蓋)了一個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫(重新實現)父類中的方法。
重寫(覆蓋)的規則:
1、重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其爲重寫而是重載.
2、重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)。
3、重寫的方法的返回值必須和被重寫的方法的返回一致;
4、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
5、被重寫的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒s有對其進行重寫。
6、靜態方法不能被重寫爲非靜態的方法(會編譯出錯)。
二、overload是重載,一般是用於在一個類內實現若干重載的方法,這些方法的名稱相同而參數形式不同。
重載的規則:
1、在使用重載時只能通過相同的方法名、不同的參數形式實現。不同的參數類型可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣);
2、不能通過訪問權限、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
多態的概念比較複雜,有多種意義的多態,一個有趣但不嚴謹的說法是:繼承是子類使用父類的方法,而多態則是父類使用子類的方法。
一般,我們使用多態是爲了避免在父類裏大量重載引起代碼臃腫且難於維護。
繼承是子類獲得父類的成員,重寫是繼承後重新實現父類的方法。重載是在一個類裏一系列參數不同名字相同的方法。多態則是用基類的引用指向子類的對象。
網上看到一個有趣的說法是:繼承是子類使用父類的方法,而多態則是父類使用子類的方法。
下面的例子包含了這四種實現:
//Triangle 繼承Shape類
class Triangle extends Shape {
//重寫Shape類中的getSides方法
public int getSides() {
return 3;
}
}
//Rectangle 繼承Shape類
class Rectangle extends Shape {
//重載Shape類中的getSides方法(在父類中getSide方法中添加了參數)
public int getSides(int i) {
return i;
}
}
//父類
public class Shape {
public boolean isSharp(){
return true;
}
public int getSides(){
return 0 ;
}
public int getSides(Triangle tri){
return 3 ;
}
public int getSides(Rectangle rec){
return 4 ;
}
public static void main(String[] args) {
Triangle tri = new Triangle();
System.out.println("Triangle is a type of sharp? " + tri.isSharp());
//isShape()爲父類中的方法,Triangle中沒有,所以tri.isSharp()方法爲繼承父類中的方法
Shape shape = new Triangle();
//new一個對象爲Triangle的Shape實例(和new一個對象爲dog的animal實例一樣理解)
//此爲父類的多態
System.out.println("My shape has " + shape.getSides() + " sides.");
}
}
比較就可以發現多態對重載的優點:如果用重載,則在父類裏要對應每一個子類都重載一個取得邊數的方法;如果用多態,則父類只提供取得邊數的接口,至於取得哪個形狀的邊數,怎樣取得,在子類裏各自實現(重寫)