方法重载(Overload)与方法覆盖(Override)

方法重载

​ 对于类的方法(包括从父类中继承的方法),如果有2个方法的方法名相同,但参数不同,那么一个方法是另一个方法的重载方法。
​ 重载方法必须满足以下条件:

  • 方法名相同

  • 方法的参数类型,个数,顺序至少有一项不同

  • 方法的返回类型可以不相同

  • 方法的修饰符可以不相同

​ 一个类中不允许定义2个方法名相同,并且参数签名(参数类型,个数,顺序)也完全相同的方法。如果存在这样的方法,Java虚拟机在运行时无法决定执行哪个方法。

方法覆盖

​ 方法覆盖也叫方法重写。如果在子类中定义的一个方法,它的名称,返回类型,参数签名刚好与父类中某个方法的名称,返回类型,参数签名一致,那么就是,子类的方法覆盖了父类的方法。
​ 覆盖方法必须满足以下条件:

  • 子类方法的名称,返回类型,参数类型必须和父类方法的名称,返回类型,参数类型一致。例如下面代码返回类型不同,导致错误。
public class Base{
    public void method(){}
}
class Sub extends Base{
    public int method(){}
}
  • 子类方法不能缩小父类方法的访问权限。public > private

    public class Base{
        public void method(){}
    }
    class Sub extends Base{
        private void method(){}
    }
    

    为什么不允许缩小父类方法权限呢?因为如果没有这个限制,将会和Java的多态冲突。例如下面的代码

    Base b=new Sub();
    b.method();
    

    在运行时,根据多态的动态绑定规则,java虚拟机会调用 b 所引用的Sub实例的method(),但是这个方法是private类型,无法访问,造成冲突。

    • 子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者是父类方法抛出的异常类的子类。

    • 只有子类和父类(包括直接父类和间接父类)才存在方法覆盖。同一个类中方法只能重载不能覆盖。

    • 父类的静态方法不能被子类覆盖为非静态方法。

    • 父类的私有(private)方法不能被子类覆盖。父类的抽象方法可以被子类通过2种途径覆盖:

      1.子类实现父类的抽象方法

      2.子类重新声明父类的抽象方法。

      Overload与Override的异同

      相同点:

      • 都要求方法同名
      • 都可以用于抽象方法和实例方法之间

      不同点:

      • 方法覆盖要求参数签名必须一致,方法重载要求参数签名必须不一致

      • 方法覆盖要求返回类型必须一致,方法重载无要求

      • 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类继承的方法)

      • 方法覆盖对方法的访问权限和抛出异常有特殊要求,方法重载没有要求

      • 父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次

posted @   HIT2022111897  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示