1.重寫(Override)
重寫字面意思來看是重新寫一遍的意思,其實就是子類繼承父類所有的方法,在保證方法名、參數列表、返回值都相同的情況下,對方法體內容進行修改或者重寫。
例如:
/**
* Author:zhangkaifei
* Date:2019/11/4
* Description: 重寫快捷鍵 Ctrl+o
*/
public class Father {
public static void main(String[] args) {
Father father=new Son();
father.sayHello();
}
public void sayHello(){
System.out.println("hello i am Father");
}
}
class Son extends Father{
@Override
public void sayHello() {
//super.sayHello();
System.out.println("hello i am son");
}
}
執行main方法,我們會發現在控制檯輸出子類son中的方法打印值
重寫總結如下:
- 發生在子類和父類之間
- 方法名、參數列表、返回類型必須相同
- 子類訪問修飾符的限制一定要大於父類中的訪問修飾符(public>protected>default>private)
- 重寫的方法不能拋出新的異常或者大於父類的檢查型異常
2.重載(Overload)
在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同甚至是參數順序不同)則視爲重載。同時,重載對返回類型沒有要求,可以相同也可以不同,但不能通過返回類型是否相同來判斷重載。
例如:
public class Father {
public static void main(String[] args) {
Father father=new Son();
father.sayHello();
}
public void sayHello(){
System.out.println("hello i am Father");
}
public void sayHello(String desc){
System.out.println(desc);
}
}
重載總結:
- 重載發生在一個類中
- 重載要求同名方法的參數列表不同(參數類型,參數個數,參數順序)
- 重載的時候返回值可以相同也可以不相同,無法根據方法返回值的類型來判斷是否重載函數。
在面試中怎麼回答兩者的區別:
方法的重載和重寫都是多態的體現,區別是重載是在編譯時的多態性,重寫是在運行時候的多態性,從JVM的角度來說,重載是靜態分派,重寫是動態分派。重載發生在一個類中,同名方法如果有不同的參數列表則被視爲重載;重寫發生在父類和子類之間;
重寫要求父類和子類有相同的參數列表,有兼容的返回類型。