当前位置: 首页 > 图灵资讯 > 技术篇> Overload 和 Override 的区别?改变返回值的类型

Overload 和 Override 的区别?改变返回值的类型

来源:图灵教育
时间:2021-12-08 10:36:58

  OverloadOverride的区别。Overloaded的方法能改变返回值的类型吗?Overload意味着重载,Override意味着覆盖,也就是重写。重载Overload意味着同一类可以有多个名称和方法,但这些方法的参数列表不同(即参数数或类型不同)。

Overload 和 Override 的区别

  重写Override意味着子类中的方法可以与父类中某种方法的名称和参数完全相同。当子类创建的实例对象调用此方法时,调用子类中的定义方法相当于覆盖父类中定义的完全相同的方法,这也是对象编程多态性的表现。子类覆盖父类时,只能抛出比父类少的异常,或者抛出父类抛出的异常子异常,因为子类可以解决父类的一些问题,不能比父类多。子类方法的访问权限只能大于父类,不能小于父类。如果父类方法是private类型,那么子类没有覆盖限制,相当于在子类中增加了一种新的方法。

  至于Overloaded的方法是否可以改变返回值的类型,这取决于你想问什么?这个话题很模糊。如果几种Overloaded方法的参数列表不同,它们的返回类型当然可以不同。但我估计你想问的问题是:如果两种方法的参数列表完全相同,是否可以让它们的返回值不同,从而实现重载Overload。这是不可能的。我们可以用反证法来解释这个问题,因为有时候在调用一种方法的时候,我们可以不定义返回结果的变量,也就是说,我们不在乎它的返回结果。例如,当我们调用map.remove(key)方法时,虽然remove方法有返回值,但我们通常不定义接收返回结果的变量。此时,假设这类中有两种名称和参数列表完全相同的方法,只有不同的返回类型,java无法确定编程师想调用哪种方法,因为它无法通过返回结果类型来判断。

  override可以翻译成覆盖,从字面上可以知道,它涵盖了一种方法并重写它,以实现不同的功能。对我们来说,最熟悉的覆盖是实现接口方法。在接口中,通常只声明方法,当我们实现它时,我们需要实现接口声明的所有方法。除了这种典型的用法外,我们还可以在继承中用子类覆盖父类。覆盖时应注意以下几点:

  1.覆盖方法的标志必须与覆盖方法的标志完全匹配,才能达到覆盖效果;

  2.覆盖方法的返回值必须与覆盖方法的返回一致;

  3.覆盖方法抛出的异常必须与被覆盖方法抛出的异常一致或其子类;

  4.覆盖的方法不能是private,否则只是其子类中新定义的方法,没有覆盖。

  overload可能对我们很熟悉,可以翻译成重载。这意味着我们可以定义一些名称相同的方法,并通过定义不同的输入参数来区分这些方法。然后调用时,VM会根据不同的参数样式选择合适的方法。使用重载时,应注意以下几点:

  1.使用重载时,只能使用不同的参数样式。例如,不同的参数类型、不同的参数数、不同的参数顺序(当然,同一方法中的几个参数类型必须不同,如fun(int、float),但不能是fun(int、int);

  2.不能通过访问权限。返回类型。重载抛出的异常;

  3.方法的异常类型和数量不会影响重载;

  4.对于继承,如果一种方法是父类访问权限为priavte,则不能在子类中重载。如果定义,它只定义了一种新的方法,而不是重载。