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的角度来说,重载是静态分派,重写是动态分派。重载发生在一个类中,同名方法如果有不同的参数列表则被视为重载;重写发生在父类和子类之间;
重写要求父类和子类有相同的参数列表,有兼容的返回类型。