2013-10-08 208 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'方法。 –