“this”关键字的类型?

时间:2013-10-08 02:13:15

标签: java inheritance this static-methods

在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.

我不明白,因为当调用x.g()时,x是B类型。在x.g()调用中,g在B中查找,然后在A中查找(因为B子类A)。 g然后调用f,A和B的实例方法,这意味着调用的f的版本取决于隐式THIS参数的类型。我假设将调用B.f(),因为X是B类型,但事实并非如此。

这究竟是什么类型的?

1 个答案:

答案 0 :(得分:3)

static方法不会被继承。当你打电话

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

您正在调用类g()中声明的A调用

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

解决了调用它们的引用的静态类型的方法。例如,方法,多态和后期绑定是他们执行实际方法的技巧。但是,由于后期绑定不适用于static方法,因此您调用A.f()

您可以在实例引用上调用static方法,并在声明的类型上解析它们。不建议这样做。