override->重寫(=覆蓋)、overload->重載、polymorphism -> 多態ide
override是重寫(覆蓋)了一個方法,以實現不一樣的功能。通常是用於子類在繼承父類時,重寫(從新實現)父類中的方法。
重寫(覆蓋)的規則:
一、重寫方法的參數列表必須徹底與被重寫的方法的相同,不然不能稱其爲重寫而是重載.
二、重寫方法的訪問修飾符必定要大於被重寫方法的訪問修飾符(public>protected>default>private)。
三、重寫的方法的返回值必須和被重寫的方法的返回一致;
四、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類;
五、被重寫的方法不能爲private,不然在其子類中只是新定義了一個方法,並無對其進行重寫。繼承
六、靜態方法不能被重寫爲非靜態的方法(會編譯出錯)。接口
overload是重載,通常是用於在一個類內實現若干重載的方法,這些方法的名稱相同而參數形式不一樣。
重載的規則:
一、在使用重載時只能經過相同的方法名、不一樣的參數形式實現。不一樣的參數類型能夠是不一樣的參數類型,不一樣的參數個數,不一樣的參數順序(參數類型必須不同);
二、不能經過訪問權限、返回類型、拋出的異常進行重載;
三、方法的異常類型和數目不會對重載形成影響;get
多態的概念比較複雜,有多種意義的多態,一個有趣但不嚴謹的說法是:繼承是子類使用父類的方法,而多態則是父類使用子類的方法。
通常,咱們使用多態是爲了不在父類裏大量重載引發代碼臃腫且難於維護。編譯
舉個例子:
public class Shape
{
public static void main(String[] args){
Triangle tri = new Triangle();
System.out.println("Triangle is a type of shape? " + tri.isShape());// 繼承class
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類的方法是重載。對二者比較,能夠發現多態對重載的優勢:
若是用重載,則在父類裏要對應每個子類都重載一個取得邊數的方法;
若是用多態,則父類只提供取得邊數的接口,至於取得哪一個形狀的邊數,怎樣取得,在子類裏各自實現(重寫)。static