重载和重写的区别

重载

重载指方法名称相同,但参数类型个数不同,是行为水平方向不同实现。
对编译器来说,方法名称和参数列表组成了一个唯一键,称为方法签名,JVM 通过方法签名决定调用哪种重载方法。
(方法签名不包括返回类型)
不管继承关系如何复杂,重载在编译时可以根据规则知道调用哪种目标方法,因此属于静态绑定。

JVM 在重载方法中选择合适方法的顺序:

  1. 精确匹配。
  2. 基本数据类型自动转换成更大表示范围。
  3. 自动拆箱与装箱。
  4. 子类向上转型。
  5. 可变参数。

重写

重写指子类实现接口或继承父类时,保持方法签名完全相同,实现不同方法体,是行为垂直方向不同实现。

元空间有一个方法表保存方法信息,如果子类重写了父类的方法,则方法表中的方法引用会指向子类实现。
父类引用执行子类方法时无法调用子类存在而父类不存在的方法。

重写方法访问权限不能变小,返回类型和抛出的异常类型不能变大,必须加 @Override。

  • 子类与父类有符合覆写规定的方法时,不加@Override 注解,也是能够覆写的,但是在实际使用时可能会产生一些疑问,到底是调用父类的方法还是子类覆写后的方法呢。
  • 而加上注解能增加代码的可读性,看到标签就知道这是从父类重写的方法,在调用时也将调用重写后的方法。
  • 并且使用@Override可以准确判断是否覆盖成功。
posted @ 2022-05-13 17:36  张三丰学Java  阅读(72)  评论(0编辑  收藏  举报