在Java中,super.getClass()打印“Child”而不是“Parent” - 为什么会这样?

时间:2015-01-17 17:53:56

标签: java super

在Java类和对象中,我们使用“this”关键字来引用类中的当前对象。 从某种意义上说,我相信“这个”实际上会回归自己的​​对象。

示例:

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

在超类和子类的场景中。我认为“超级”关键字会返回超类的对象。但是这次我似乎弄错了:

示例:

class Parent
{
    public Parent(){
    }
}

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

我的问题:在上面的示例中,我希望编译器打印出class Parent,但是会打印出class Child。为什么会这样?什么超级实际返回?

3 个答案:

答案 0 :(得分:11)

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

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()的情况下,这是一个方法,它返回它被调用的类,并且不能被覆盖 - 所以虽然我可以看到为什么你可能期望它返回{{ 1}},它仍然正常使用相同的实现,返回Parent.class。 (如果您确实需要父类,则应该查看Child API。)

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

Class

答案 1 :(得分:2)

getClass()方法返回对象的类。超级&这个引用相同的对象。所以这不是因为你用super引用你的对象,突然对象改变了类,它仍然是用于实例化它的类的实例,因此getClass()将始终返回相同的Class,无论你是从这个调用它还是来自超级。

Super用于引用超类中定义的方法的实现,它通常用于那些在子类中被重写以调用原始行为的方法。

答案 2 :(得分:0)

super关键字将在父级中调用重写方法。孩子没有覆盖那种方法。所以它将忠实地返回正确的类,即Child。您没有这样获得Parent类的实例。