重载与重写

  • 重载(Overloading)和重写(Overriding)是Java中两个重要的概念,都是多态性的体现,但它们有着不同的含义和使用场景。
  • 简单来说:
    • 重载:同一个方法可以根据输入的数据不同执行不同的结果
    • 重写:子类可以重新定义父类的方法,以实现不同的功能

1. 重载(Overloading)

  • 重载发生在同一个类中,也可以是父类和子类之间。方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同。

2. 重写(Overriding)

  • 重写一般发生在子类和父类之间,子类可以重写父类中允许访问的方法。方法名、参数列表型必须相同,子类方法返回值类型应比父类方法返回值类型更小或相等,抛出的异常范围小于等于父类(更严格),访问修饰符范围大于等于父类(更宽松)。
  • 如果父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够被再次声明。
  • 重写要遵循“两同两小一大”:
    • 两同:方法名相同,参数列表相同
    • 两小:子类返回值类型必须与父类相同,或者是其子类;子类抛出的异常范围小于等于父类
    • 一大:子类访问修饰符范围大于等于父类
  • 关于重写的返回值类型:如果方法的返回类型是void和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。
区别 重载(Overloading) 重写(Overriding)
发生范围 同一个类中 子类和父类之间
方法签名 方法名必须相同,参数列表不需要相同 方法名必须相同,参数列表也必须相同
返回类型 随意 子类返回值类型必须与父类相同,或者是其子类
访问修饰符 随意 子类比父类更严格(public > protected > default > private)
绑定时期 编译时绑定或静态绑定 运行时绑定 (Run-time Binding) 或称动态绑定