对Java继承规则感到困惑
在下面的代码中,我有以下问题: 我不懂这个词的语义对Java继承规则感到困惑,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,在下面的代码中,我有以下问题: 我不懂这个词的语义 One hybrid=new Two() 我的理解是,Java在这种情况下执行所谓的向上转换。 即使hybrid被声明为One的实例,编译器也将其转换为Two实例 这是正确的吗 因此,在#3,它调用Two的方法foo。到目前为止还不错 至少有5件事对我来说变得神秘起来: 究竟为什么编译器调用One的bar方法而不是Two?我错过了什么 谢谢 马塞尔 class One { public One() {} public String fo
One hybrid=new Two()代码>
我的理解是,Java在这种情况下执行所谓的向上转换。
即使hybrid
被声明为One
的实例,编译器也将其转换为Two
实例
这是正确的吗
因此,在#3,它调用Two
的方法foo
。到目前为止还不错
至少有5件事对我来说变得神秘起来:
究竟为什么编译器调用One
的bar
方法而不是Two
?我错过了什么
谢谢
马塞尔
class One {
public One() {}
public String foo() {return "One-foo";}
public String bar(One o) {return "One-bar " + o.foo();}
};
class Two extends One {
public Two() {}
public String foo() {return "Two-foo";}
public String bar(Two t) {return "Two-bar " + t.foo();}
};
class Main {
public static void main(String[] args) {
One one = new One();
Two two = new Two();
One hybrid = new Two();
System.out.println(one.foo()); // #1 One-foo
System.out.println(two.foo()); // #2 Two-foo
System.out.println(hybrid.foo()); // #3 Two-foo
System.out.println(one.bar(two)); // #4 One-bar Two-foo
System.out.println(hybrid.bar(two)); // #5 One-bar Two-foo
System.out.println(two.bar(hybrid)); // #6 One-bar Two-foo
}
}
与下面的输出相比,我希望得到以下输出:
One-foo
Two-foo
Two-foo
One-bar Two-foo
Two-bar Two-foo
Two-bar Two-foo
实际产出:
One-foo
Two-foo
Two-foo
One-bar Two-foo
One-bar Two-foo
One-bar Two-foo
字符串条(两个t)
不会覆盖字符串条(一个o)字符串条(两个t)
不会覆盖字符串条(一个o)
尝试使用@覆盖
注释。问题是字符串条(两个t)
不会覆盖字符串条(一个o)
,它只是将其隐藏起来。有您想要的答案,特别是:“重写方法”。如果子类中的参数类型不相同,则该方法将被重载而不是重写。您应该始终使用@Override注释以确保不会意外发生这种情况尝试使用@Override
注释。问题是条(两个t)
没有覆盖条(一个o)
,它只是将其阴影化。有您想要的答案,特别是:“重写方法”。如果子类中的参数类型不相同,则该方法将被重载而不是重写。您应该始终使用@Override注释以确保不会意外发生这种情况。类1和类2中的foo()不是这样吗?为什么在案例#3中,两个的foo方法被称为@MarcelSchaible,因为foo()
没有参数bar()
有一个参数,它的类型在两个类中都不相同。ok,这很有意义。现在它在我的脑海里发出咔哒声;-)类1和类2中的foo()不是同样的情况吗?为什么在案例#3中,两个的foo方法被称为@MarcelSchaible,因为foo()
没有参数bar()
有一个参数,它的类型在两个类中都不相同。ok,这很有意义。现在它在我的脑海里发出咔哒声;-)