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'方法。 –