who*_*ows 0 java polymorphism inheritance
我有两个类定义为:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我将两个变量定义为:
Mammal m = new Mammal();
Animal a = new Mammal();
Run Code Online (Sandbox Code Playgroud)
当我打电话时m.info("test"),它会打印出来
"哺乳动物"
当我打电话时a.info("test"),它会打印出来
"动物"
为什么Mammal类型调用Mammal info()方法,Animal类型Animal info()在它们都是Mammal对象时调用方法?
你正在重载方法,而不是覆盖它.
过载被选择在编译时,以及当编译时类型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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在它将在两种情况下都打印"哺乳动物",因为在执行时根据对象的实际类型选择方法的实现.记住它们之间的区别:
我还注意到你正在使用嵌套类(否则static修饰符将无效).这不会改变这里的行为,但它会对类的功能进行其他更改.我强烈建议你尝试用顶级类的大部分时间工作,只使用嵌套类型时,有一个真正令人信服的理由这样做.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |