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 参数的类型。我会假设 Bf() 会被调用,因为 X 是 B 类型,但事实并非如此。

这到底是什么类型的?

4

1 回答 1

3

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

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

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

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

方法在调用它们的引用的静态类型上解析。例如方法、多态性和后期绑定都可以执行实际的方法。但是,由于后期绑定不适用于static方法,因此您正在调用A.f().

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

于 2013-10-08T02:16:12.723 回答