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類型的,但事實並非如此。
這是什麼類型呢?
這就是爲什麼你在這裏得到編譯器警告。 – Thilo
我很困惑。此鏈接http://stackoverflow.com/a/10292034/2288418表示所有可訪問的方法都是繼承的。此外,如果它沒有被繼承,是否會導致編譯時錯誤(試圖在B中查找g時xg()? –
正如答案所述,假設您的子類不聲明靜態方法在這種情況下,因爲你的子類仍然是它的父類的類型,所以你仍然可以直接通過引用或類標識符訪問'static'方法。 –