我对如何在子类中创建方法感到困惑。我正用这个撞在砖墙上,甚至不确定如何说出这个问题。
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
}
public double method1(double x, double y) { ... }
public int method1(double x, double y) { ... }
public double method1(int x, int y) { .... }
public int method1(double x, double y, double z) { ... }
以下哪种方法在子类中是合法的,为什么?
答案 0 :(得分:5)
使用新功能覆盖method1。
非法,因为它具有相同的参数签名但返回类型不同。
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)
另请参阅http://en.wikipedia.org/wiki/Function_overloading和http://en.wikipedia.org/wiki/Method_overriding
答案 3 :(得分:2)
覆盖规则: - *参数必须相同
返回类型必须相同或应该是协变的
异常,如果选中它应该是该重写方法的子类
访问修饰符应限制相同或更少
重载规则: - *参数必须不同
返回类型可以相同
访问修饰符可以相同
阅读Katherine Sierra,Bert Bates(SCJP书籍)获取完整规则或Java doc