在 Java super.getClass() 中打印 "Child" 而不是 "Parent" - 这是为什么?

In Java super.getClass() prints "Child" not "Parent" - why is that?

在Java classes和对象中,我们使用"this"关键字来引用class内的当前对象。 从某种意义上说,我相信 "this" 实际上 return 是对象本身。

示例:

class Lion
{
    public void Test()
    {
        System.out.println(this);  //prints itself (A Lion object)
    }
}

在superclass和subclass的场景中。我认为 "super" 关键字会 return superclass 的对象。不过这次好像弄错了:

示例:

class Parent
{
    public Parent(){
    }
}

class Child extends Parent
{
    public Child(){
        System.out.println(super.getClass()); //returns Child. Why?
    }
}

我的问题: 在上面的例子中,我希望编译器打印出 class Parent,但它却打印出 class Child。为什么会这样?什么超级居然returns?

使用 super 的方法调用只会忽略当前 class 中的任何覆盖。例如:

class Parent {
    @Override public String toString() {
        return "Parent";
    }
}

class Child extends Parent {
    @Override public String toString() {
        return "Child";
    }

    public void callToString() {
        System.out.println(toString()); // "Child"
        System.out.println(super.toString()); // "Parent"
    }
}

在调用 getClass() 的情况下,这是一个 return 调用 class 的方法,并且不能被覆盖 - 所以虽然我可以看到为什么您可能期望它 return Parent.class,它仍然使用与正常 returning Child 相同的 实现 。 (如果你真的想要父 class,你应该看看 Class API。)

事实上,这通常用作覆盖的一部分。例如:

@Override public void validate() {
    // Allow the parent class to validate first...
    super.validate();
    // ... then perform child-specific validation
    if (someChildField == 0) {
        throw new SomeValidationException("...");
    }
}

getClass() 方法 return 对象的 class。 Super & this 引用同一个对象。所以并不是因为你用 super 引用你的对象突然改变了对象 class,它仍然是用于实例化它的 class 的实例,因此 getClass()总是 return 相同 Class 无论你是从这个还是从 super.

Super 旨在用于引用在 super class 中定义的方法的实现,它通常用于那些在 sub class 中被覆盖的方法以调用原始行为。

super 关键字将调用 parent 中的重写方法。 Child 没有覆盖该方法。所以它将忠实地 return 正确的 class 即 Child。您不会通过这种方式获得 Parent class 的实例。