重载和重写的区别
重载
重载指方法名称相同,但参数类型个数不同,是行为水平方向不同实现。
对编译器来说,方法名称和参数列表组成了一个唯一键,称为方法签名,JVM 通过方法签名决定调用哪种重载方法。
(方法签名不包括返回类型)
不管继承关系如何复杂,重载在编译时可以根据规则知道调用哪种目标方法,因此属于静态绑定。
JVM 在重载方法中选择合适方法的顺序:
- 精确匹配。
- 基本数据类型自动转换成更大表示范围。
- 自动拆箱与装箱。
- 子类向上转型。
- 可变参数。
重写
重写指子类实现接口或继承父类时,保持方法签名完全相同,实现不同方法体,是行为垂直方向不同实现。
元空间有一个方法表保存方法信息,如果子类重写了父类的方法,则方法表中的方法引用会指向子类实现。
父类引用执行子类方法时无法调用子类存在而父类不存在的方法。
重写方法访问权限不能变小,返回类型和抛出的异常类型不能变大,必须加 @Override。
- 子类与父类有符合覆写规定的方法时,不加@Override 注解,也是能够覆写的,但是在实际使用时可能会产生一些疑问,到底是调用父类的方法还是子类覆写后的方法呢。
- 而加上注解能增加代码的可读性,看到标签就知道这是从父类重写的方法,在调用时也将调用重写后的方法。
- 并且使用@Override可以准确判断是否覆盖成功。