以下哪种方法在子类中是合法的?

时间:2013-11-10 13:27:59

标签: java methods arguments return-value subclass

我对如何在子类中创建方法感到困惑。我正用这个撞在砖墙上,甚至不确定如何说出这个问题。

import java.io.*;
public class A {
   public double method1(double x, double y) { return 1.0;  }
}
class B extends A {
   //subclass method to be placed after this line

}

  1. public double method1(double x, double y) { ... }
  2. public int method1(double x, double y) { ... }
  3. public double method1(int x, int y) { .... }
  4. public int method1(double x, double y, double z) { ... }
  5. 以下哪种方法在子类中是合法的,为什么?

4 个答案:

答案 0 :(得分:5)

  1. 使用新功能覆盖method1。

  2. 非法,因为它具有相同的参数签名但返回类型不同。

  3. 3,4。合法但实际上是单独的方法。

    只需将参数类型视为方法名称的一部分:

    • 仅当名称加上参数类型完全匹配时,才会使用新功能覆盖相同的方法。在这种情况下,返回类型必须匹配(从Java 1.5开始,返回类型可能专门用于子类,请参阅https://blogs.oracle.com/sundararajan/entry/covariant_return_types_in_java

    • 在其他情况下,添加的方法只是具有相同名称的单独方法。 Java根据提供的参数类型在编译时为每次调用静态选择正确的一个。如果参数兼容且多个方法的名称相同,则会选择最接近的匹配。

答案 1 :(得分:2)

如果按照我的理解在课堂上放置以下方法,就应该这样做:

public double method1(double x, double y) { ... }

这是重写方法,这意味着你覆盖了子类中method1的行为,这是完全合法的。

public int method1(double x, double y) { ... }

编译错误:这是尝试执行方法重载但不是合法的方法。方法重载允许具有相同的方法名称但不同的类型/数量的参数。使用不同的参数列表完成方法重载,但不使用不同的返回类型。

public double method1(int x, int y) { .... }

这是一个合法的重载方法

public int method1(double x, double y, double z) { ... }

再次是一个合法的重载方法

答案 2 :(得分:2)

  1. 覆盖A中的方法并且是合法的
  2. 是非法因为返回类型不同而不是A中方法的返回类型的专业化
  3. 是重载方法,因为参数类型不同
  4. 是一个重载方法,因为有更多参数
  5. 另请参阅http://en.wikipedia.org/wiki/Function_overloadinghttp://en.wikipedia.org/wiki/Method_overriding

答案 3 :(得分:2)

  1. 法律覆盖
  2. 非法律覆盖,因为返回类型应该是协变的或相同的
  3. 法律超载
  4. 法律超载
  5. 覆盖规则: - *参数必须相同

    • 返回类型必须相同或应该是协变的

    • 异常,如果选中它应该是该重写方法的子类

    • 访问修饰符应限制相同或更少

    重载规则: - *参数必须不同

    • 返回类型可以相同

    • 访问修饰符可以相同

    阅读Katherine Sierra,Bert Bates(SCJP书籍)获取完整规则或Java doc