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' –