0

我对如何在子类中创建方法感到困惑。我的头撞到了一堵砖墙上,甚至不知道如何表达这个问题。

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) { ... }

以下哪种方法在子类中是合法的,为什么?

4

4 回答 4

5
  1. 用新功能覆盖 method1。

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

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

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

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

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

于 2013-11-10T13:33:09.477 回答
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) { ... }

又是一个合法的重载方法

于 2013-11-10T13:34:06.077 回答
2
  1. 覆盖A中的方法并且是合法的
  2. 是非法的,因为 returntype 不同,而不是 A 中方法的 returntype 的特化
  3. 是一个重载的方法,因为参数类型不同
  4. 是一个重载的方法,因为有更多的参数

另见http://en.wikipedia.org/wiki/Function_overloadinghttp://en.wikipedia.org/wiki/Method_overriding

于 2013-11-10T13:36:30.963 回答
2
  1. 法律优先
  2. 不合法覆盖,因为返回类型应该是协变的或相同的
  3. 合法超载
  4. 合法超载

最重要的规则:- * 参数必须相同

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

  • 如果检查了异常,则它应该是该重写方法的子类

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

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

  • 返回类型可以相同

  • 访问修饰符可以相同

阅读 Katherine Sierra, Bert Bates (SCJP Book) 了解完整规则或 Java 文档

于 2013-11-10T13:56:18.807 回答