16
简单的问题,奇怪的结果。我有两个类A
和B
:扩展类的重载方法
public class A
{
protected int num;
public A(int n)
{
num = n;
}
public boolean f(A a)
{
return num == a.num * 2;
}
}
public class B extends A
{
public B(int n)
{
super(n);
}
public boolean f(B b)
{
return num == b.num;
}
}
为什么y1.f(y2)
呼叫f()
方法A
,而不是在B
?
A y1 = new B(10);
B y2 = new B(10);
System.out.println(y1.f(y2));
难道不应该叫f()
在B
作为B
比A
更具体?
尽管@ JonSkeet的回答总是不容置疑的,只是也支持这个字节代码..你也可以检查什么方法正在通过,你可以看到编译代码为'(y1.f(y2)) '当你看到字节码 '25:invokevirtual#27 // Method com/package1/Af:(Lcom/p ackage1/A;)Z' –