//B.java
class A
{
protected void hello(C c){
System.out.println("HelloA");
}
}class C
{
}class D extends C
{
}public class B extends A
{
protected void hello(D d){
System.out.println("Hello B-1");
}
protected void hello(C c){
System.out.println("Hello B-2");
}
public static void main(String[] args)
{
D d = new D();
C c = d;
A a = new B();
a.hello(c); //输出为“Hello B-2”
a.hello(d); //输出为“Hello B-2”
}
}为何执行“a.hello(d)”会输出"protected void hello(C c)"定义的结果??
我的JDK版本为1.5,请高人指点一下。
class A
{
protected void hello(C c){
System.out.println("HelloA");
}
}class C
{
}class D extends C
{
}public class B extends A
{
protected void hello(D d){
System.out.println("Hello B-1");
}
protected void hello(C c){
System.out.println("Hello B-2");
}
public static void main(String[] args)
{
D d = new D();
C c = d;
A a = new B();
a.hello(c); //输出为“Hello B-2”
a.hello(d); //输出为“Hello B-2”
}
}为何执行“a.hello(d)”会输出"protected void hello(C c)"定义的结果??
我的JDK版本为1.5,请高人指点一下。
动态绑定,自然会调用B的方法,尽管定义的时候是A a = new B();
D是C 所以调用的时候把D和C是一样的,而C做为超类,有更大兼容性,所以应该先调用protected void hello(C c)
所议会调用 B.hello(C c)
所谓完全相同 是指getClass()是一样的
D extend C getClass()不同 所以protected void hello(D d)不是覆写不晓得说的对不对
看来方法的重载和重写的含义用这个问题可以比较明白直观的体现.
按照阁下的说法:
”只覆写了protected void hello(C c)
所议会调用 B.hello(C c)"我又试了一下:
在A类中加入如下代码:
protected void hello(D d){
System.out.println("HelloA2");
}这样似乎就是在B中也将hello(D d)覆写了,
可是执行结果依旧是“Hello B-2“,也就是说仍然调用的B.Hello(C c)。为何明明有类型更匹配的参数,而JAVA偏偏视而不见呢????
谢谢楼上各位热心的回复,可是截至目前我还是不明白。。~!
兄弟确信A中加入hello(D d)方法后结果会有变化????
我的不行。。