簡體   English   中英

擴展類的重載方法

[英]Overloading method on extended class

簡單的問題,奇怪的結果。 我有兩個AB類:

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() ,因為BA更具體?

為什么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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM