当前位置: 首页 > 面试题库 >

在Java中,super.getClass()输出“ Child”而不是“ Parent”-为什么?

董良策
2023-03-14
问题内容

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

例如:

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

在超类和子类的情况下。我以为“ super”关键字将返回超类的对象。但是似乎这次我弄错了:

例:

class Parent
{
    public Parent(){
    }
}

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

我的问题: 在上面的示例中,我期望编译器可以打印出来class Parent,但是它可以打印出来class Child。为什么会这样呢?什么超级真正返回?


问题答案:

使用的方法调用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(),这是一个方法,它返回被调用的类,并且不能被覆盖-
因此,尽管我可以看到您为什么期望它返回Parent.class,但它仍然使用与通常相同的 实现
,返回Child。(如果您确实需要父类,则应查看ClassAPI。)

实际上,通常将其用作替代的一部分。例如:

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


 类似资料:
  • 问题内容: 说我有一张这样的表: 如何才能以这种格式对结果进行实际排序?即由父级->子级->子子级命令,根据我只要求说最多5个级别?我已经研究了“嵌套集模型”,但是对于我的要求而言,它似乎太复杂了。我不确定的是真正理解了可用于显示如上所示结果的SQL查询,或者在这种情况下,我应该使用像PHP这样的服务器端语言来帮我吗? 问题答案: 您可以尝试以下方法: 如果层次结构是有限的,则不需要递归查询。 o

  • 问题内容: 我不理解javascript中的这种行为来继承,我一直都这样定义它: 但就我而言,这些行: 当我在Spaceship构造函数中执行console.log(this)时,可以看到 proto 属性设置为Spaceship而不是GameObject,如果删除它们,则将其设置为GameObject。 如果我使用: 我对此没有更多问题。之所以阻止我,是因为我有另一个具有add()方法的对象,并

  • 为什么在这个输出的末尾有一个尾随的%?我尝试刷新流(而不是endl),但是当我调用endl结束流时,它会删除%。这里的任何帮助都将不胜感激。 下面是关于编译器的更多信息,我使用的是macOS 10.15.4:

  • 有我的密码 我怎样才能得到异常原因?在我的例子中,如果我运行gradle,从命令行安装(没有jenkins)是:错误:不兼容的类型:不能转换为boolean 但我会在jenkins作业控制台输出中看到错误

  • 问题内容: 我正在尝试该功能。 从numpy文档中,我了解到,如果仅给出一个数组作为输入,它应该返回该数组非零的索引(即“ True”): 如果仅给出条件,则返回元组condition.nonzero(),其中condition为True的索引。 但是,如果尝试一下,它将返回一个包含两个元素的 元组 ,其中第一个是所需的索引列表,第二个是空元素: 所以问题是:为什么?这种行为的目的是什么?在什么情

  • 问题内容: 我正在使用猫鼬(节点),输出id而不是_id的最佳方法是什么? 问题答案: 我在执行此操作的模型上创建toClient()方法。这也是重命名/删除您不想发送给客户端的其他属性的好地方: