我有两个类定义为:
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")
时,会打印
“哺乳动物”
当我致电a.info("test")
时,会打印
“动物”
为什么Mammal
类型调用Mammal
info()
方法,Animal
类型调用Animal
info()
方法Mammal
个对象?
答案 0 :(得分:5)
你重载方法,而不是重写。
在编译时选择重载,当编译时类型a
为Animal
时,对a.info("test")
的调用只能 解析为info(Object)
中的Animal
方法。
如果你想覆盖方法,你需要使用相同的签名 - 指定@Override
注释以让编译器为你检查:
public static class Mammal extends Animal {
@Override public void info(Object s) {
System.out.print("Mammal");
}
}
现在它将在两种情况下都打印“Mammal”,因为该方法的实现是在执行时根据对象的实际类型选择的。记住它们之间的区别:
我还注意到你正在使用嵌套类(否则static
修饰符将无效)。这不会改变这里的行为,但它会对类的功能进行其他更改。我强烈建议您在大多数情况下尝试使用顶级类,只有在真正令人信服的理由时才使用嵌套类型。
答案 1 :(得分:0)
因为
public void info(Object o) {
System.out.print("Animal");
}
不会覆盖
public void info(String s) {
System.out.print("Mammal");
}
他们的签名不同。即一个是Object
另一个 - String
。