[英]Overloading method on extended class
簡單的問題,奇怪的結果。 我有兩個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)
在A
而不是在B
調用f()
方法?
A y1 = new B(10);
B y2 = new B(10);
System.out.println(y1.f(y2));
是不是應該在B
調用f()
,因為B
比A
更具體?
為什么y1.f(y2)在A中而不是在B中調用f()方法?
因為y1
的編譯時類型是A
重載是在編譯時執行的...您調用方法的對象的執行時類型僅與重寫相關。
所以編譯器選擇方法f(A)
因為它是它知道它可以在y1
調用的唯一f
方法(並且在給定參數列表的情況下檢查它是否適用)。 該方法在B
未被覆蓋,因此在執行時,調用A
的implmenetation。
作為一個更為明顯的例子,請考慮以下代碼:
Object x = "foo";
int length = x.length();
這甚至不會編譯,因為Object
不包含length()
方法。 String
確實如此,但編譯器沒有考慮到這一點,因為x
的編譯時類型是Object
,而不是String
- 即使我們可以在執行時告訴它, x
的值將是對String
對象的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.