在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类型,但事实并非如此。
这究竟是什么类型的?
答案 0 :(得分:3)
static
方法不会被继承。当你打电话
static void h(B x) {
x.g();
}
您正在调用类g()
中声明的A
调用
static void f() {
System.out.println("A.f");
}
解决了调用它们的引用的静态类型的方法。例如,方法,多态和后期绑定是他们执行实际方法的技巧。但是,由于后期绑定不适用于static
方法,因此您调用A.f()
。
您可以在实例引用上调用static
方法,并在声明的类型上解析它们。不建议这样做。