java - 从子类对象使用超类的 getClass 方法
问题描述
我一共有三个班。主要、动物(超类)和猫(子类)。当我尝试调用 whatIsTheClass() 方法时,我不理解输出“Cat”。我期待看到输出“动物”。我期望输出“Animal”的原因是因为我相信方法 whatIsTheClass() 是从 Animal 对象而不是 Cat 对象调用的,因为子类不包含此方法。
主类:
package com.example.java;
public class Main {
public static void main(String[] args) {
Animal cat = new Cat();
}
}
猫类:
package com.example.java;
public class Cat extends Animal {
public Cat() {
super();
whatIsTheClass();
}
}
动物类:
package com.example.java;
public class Animal {
public void whatIsTheClass() {
System.out.println(this.getClass().getSimpleName());
}
}
我的理解是,在继承中,子类不会复制超类的方法。如果 Subclass 对象中没有定义被调用的方法,它将在 Superclass 对象中查找被调用的方法。如果被调用的方法是在超类对象中定义的,它将从那里被调用。在这种情况下,由于子类没有定义它自己的 whatIsTheClass() 方法,它必须使用在超类对象中定义的 whatIsTheClass() 方法。但是如果从超类对象调用whatIsTheClass(),为什么它返回的是子类的名称而不是超类的名称呢?
解决方案
该方法whatIsTheClass
可以在 中定义Animal
,但在哪个类的代码getClass()
中调用没有区别。这完全是关于对象的运行时类型,如Javadocs 中getClass()
所述:
返回 this 的运行时类
Object
。
由 指定的对象的运行时类型cat
是Cat
。
这也是为什么没有类必须重写getClass()
只是为了返回正确的Class
对象。(无论如何,方法getClass()
是。)final
推荐阅读
- java - org.springframework.beans.factory.UnsatisfiedDependencyException:创建类路径资源中定义的名称为“commandGateway”的bean时出错
- python - 如何使用熊猫在多列excel中使用相同的条件(替换)?
- c# - CLError 和 CLErrorDomain 中的未知类型名称“NS_ASSUME_NONNULL_BEGIN”错误
- python - 如何说服鼠标右键单击弹出菜单在wxPython中显示鼠标光标位置附近?
- git - 管道#37652在阶段准备索引中的主控失败
- json - 如何正确地 JSON 编码/解码 Flutter 中的 Duration 字段
- sql - 加入与父母和祖父母的关系
- javascript - 不确定如何在 useEffect 中集成功能
- angular - 有什么方法可以优化 Docker Image 的大小吗?
- c# - 从 UWP 应用程序重新启动 Windows 平板电脑?