2013-10-08 248 views
3

在Java中,「this」是指當前對象。我以爲,「這」是同一類型與當前對象,但考慮這個例子:「this」關鍵字的類型?

class A { 
    static void f() { 
     System.out.println("A.f"); 
    } 
    void g() { 
     this.f(); 
    } 
} 
class B extends A { 
    static void f() { 
     System.out.println("B.f"); 
    } 
} 
public class C { 
    public static void main(String[] args) { 
     B test = new B(); 
     h(test); 
    } 
    static void h(B x) { 
     x.g(); 
    } 
} 

結果是:

A.f. 

我不明白,因爲當XG()被調用時,x是類型B.在xg()調用中,g在B中查找,然後在A中查找(因爲B子類A)。 g然後調用f(A和B的實例方法),這意味着調用的f的版本取決於隱含的THIS參數的類型。我會假設B.f()會被調用,因爲X是B類型的,但事實並非如此。

這是什麼類型呢?

回答

3

static方法不被繼承。當你調用

static void h(B x) { 
    x.g(); 
} 

您調用A類調​​用

static void f() { 
    System.out.println("A.f"); 
} 

方法對靜態類型,他們被稱爲上參考的是解決宣佈g()。例如,方法,多態性和後期綁定都在執行實際方法。但是,由於後期綁定不適用於static方法,因此您致電A.f()

您可以在實例引用上調用static方法,並根據它們的聲明類型對它們進行解析。這不被推薦。

+1

這就是爲什麼你在這裏得到編譯器警告。 – Thilo

+0

我很困惑。此鏈接http://stackoverflow.com/a/10292034/2288418表示所有可訪問的方法都是繼承的。此外,如果它沒有被繼承,是否會導致編譯時錯誤(試圖在B中查找g時xg()? –

+1

正如答案所述,假設您的子類不聲明靜態方法在這種情況下,因爲你的子類仍然是它的父類的類型,所以你仍然可以直接通過引用或類標識符訪問'static'方法。 –