我有两个类定义为:
public static class Mammal extends Animal {
public void info(String s) {
System.out.print("Mammal");
}
}
public static class Animal {
public void info(Object o) {
System.out.print("Animal");
}
}
现在我定义两个变量:
Mammal m = new Mammal();
Animal a = new Mammal();
当我调用m.info("test")
时,它会打印
"Mammal"
当我调用a.info("test")
时,它会打印
"Animal"
为什么 Mammal
类型调用 Mammal
info()
方法,而 Animal
类型调用 Animal
info()
方法,当它们都是 Mammal
对象时?
最佳答案
您正在重载该方法,而不是覆盖它。
重载是在编译时选择的,当 a
的编译时类型为 Animal
时,则调用 a.info("test")
只能解析为 Animal
中的 info(Object)
方法。
如果您想覆盖该方法,则需要使用相同的签名 - 指定@Override
注释以使编译器为您检查:
public static class Mammal extends Animal {
@Override public void info(Object s) {
System.out.print("Mammal");
}
}
现在,在这两种情况下它都会打印“Mammal”,因为该方法的实现是在执行时根据对象的实际类型选择的。记住它们之间的区别:
- 重载:在编译时发生,选择方法签名
- 覆盖:在执行时发生,选择该签名的实现
我还注意到您正在使用嵌套类(否则 static
修饰符将无效)。这不会改变这里的行为,但它确实对类的功能进行了其他更改。我强烈建议您在大多数时间尝试使用顶级类,只有在有真正令人信服的理由时才使用嵌套类型。
关于java - Java如何选择多态中的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21711097/