首页 > 其他分享 >方法重载(Overload)与方法覆盖(Override)

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

时间:2024-05-27 22:44:55浏览次数:17  
标签:覆盖 子类 Overload 重载 Override 父类 方法 public

方法重载

​ 对于类的方法(包括从父类中继承的方法),如果有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的异同

      相同点:

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

      不同点:

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

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

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

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

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

标签:覆盖,子类,Overload,重载,Override,父类,方法,public
From: https://www.cnblogs.com/zhh200442/p/18216737

相关文章

  • 四进制加法(运算符重载)
    题目描述定义一个四进制的类,重定义“+”号实现四进制数的累加。输入第一行输入所需要的四进制数的个数第二行开始,依次输入四进制数输出所有输入四进制数累加的和//输入示例:313221输出示例:102AC代码:#include<iostream>#include<string>usingnamespacestd;......
  • Lua中调用ref和out修饰参数的函数/重载函数
    [12]lua中调用ref和out修饰参数的函数数值publicintRefCompute(inta,refintb,refintc,intd){b+=a;c+=d;returnb+c;}publicintOutCompute(inta,outintb,outintc,intd){b=a+1;c=d+2;returnb+c;}......
  • 经纬恒润第三代重载自动驾驶平板车
        随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。经纬恒润作为无人驾驶解决方案提供商,见证了港口在无人化运营方面的尝试及发展,并深度参与其中,先后在日照港、龙拱港、京唐港等重要......
  • 函数重载
    一、重载原则原则:不允许两个函数除了返回类型以外其他所有的要素全部相同顶层const不影响传入函数的对象,一个顶层const的形参无法与另一个没有顶层const的形参区分。intfun(constinta);//const普通变量,这个和下面的是一样的intfun(inta);intfun(int*a);......
  • flutter开发项目编译失败依赖冲突的解决方法dependency_overrides
    1.问题在复杂的稍等大点的flutter项目当中,依赖各种第三方框架是很正常,而且也有有很多依赖的,但有时难免存在不同的框架刚好使用了同一个依赖库的不同版本,特别是依赖了系统的某个库的不同版本这个时候就难免会出现同一个依赖库不同版本冲突的编译失败问题2.现象Becauseflut......
  • python 实现类重载(类似C#的类重载,但是远不如C#的类重载好用)
    pipinstallmultipledispatch-ihttps://mirrors.aliyun.com/pypi/simplefrommultipledispatchimportdispatchclassMyClass:ab=11234def__init__(self):self.aa=1@dispatch()defcalculate(self):self.aa=1111......
  • C++ lambda的重载
    先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道)。而且即使代码完全一样的两个lambda也会有完全不同的类型。但虽然不能直接实现lambda重载,我们有办法去模拟。在介绍怎么模拟之前,我们先看看c++里的functor是怎么重载的。首先类的函数调用运算符是可以重载......
  • 运算符重载
    运算符重载基本规则可以重载的运算符:不可重载的运算符://返回类型operator后面加运算符(参数列表)//eg.Integeroperator+(Integerl,Integerr);classInteger{public:Integer(intn=0):i(n){}constIntegeroperator+(constInteger&v){ //在类中......
  • C++多态与虚拟:函数重载(Function Overloading)
    重载(Overloading):所谓重载是指不同的函数实体共用一个函数名称。例如以下代码所提到的CPoint之中,有两个memberfunctions的名称同为x():1classCPoint{23public:4floatx();5voidx(floatxval);67};  其两个memberfunctions实现代码如下:1f......
  • 使用 Gradio 的“热重载”模式快速开发 AI 应用
    在这篇文章中,我将展示如何利用Gradio的热重载模式快速构建一个功能齐全的AI应用。但在进入正题之前,让我们先了解一下什么是重载模式以及Gradio为什么要采用自定义的自动重载逻辑。如果您已熟悉Gradio并急于开始构建,请直接跳转到第三部分构建文档分析应用。重载模式具体是......