Java 为什么在父方法中返回子类名?
我有一个名为Java 为什么在父方法中返回子类名?,java,inheritance,Java,Inheritance,我有一个名为Entity的类,它是我在整个程序中使用的许多其他对象的abstract超类(例如Apple类) 在许多方法中,我通过打印从中打印调试语句的类名,然后是实际的调试消息来打印调试语句。然而,令我惊讶的是,当我从Apple的实例调用继承的方法时,Apple的类名被打印出来,而不是实体的类名(该方法实际位于该实例中) 以一个更容易发布代码片段的相关示例为例,我覆盖了toString(),如下所示: public abstract class Entity { private St
Entity
的类,它是我在整个程序中使用的许多其他对象的abstract
超类(例如Apple
类)
在许多方法中,我通过打印从中打印调试语句的类名,然后是实际的调试消息来打印调试语句。然而,令我惊讶的是,当我从Apple
的实例调用继承的方法时,Apple
的类名被打印出来,而不是实体的类名(该方法实际位于该实例中)
以一个更容易发布代码片段的相关示例为例,我覆盖了toString()
,如下所示:
public abstract class Entity {
private String name;
@Override
public String toString() {
return getClass().getSimpleName() + " " + (name != null ? name : super.hashCode());
}
}
因为我没有在Apple
类中进一步重写此方法,所以我希望返回字符串的第一部分是Entity
,而不是Apple
。但它返回的是苹果公司的
(对于这个用例来说,它以这种方式工作确实很好,但仍然有点令人困惑)
我尝试查看对象的实现#getClass()
,但无法查看,因为它被声明为本机方法
公共最终本机类getClass()代码>
有人能解释为什么会发生这种情况吗?您正在调用getClass()
。它总是返回与对象的实际执行时类型关联的类
对象的引用,而不是调用它的表达式的编译时类型的类。例如:
Object foo = "this is a string";
Class<?> clazz = foo.getClass();
Object foo=“这是一个字符串”;
类clazz=foo.getClass();
clazz
将引用String
的类,而不是对象的类
您无需查看getClass()
的实现—只需查看以下内容:
表示此对象的运行时类的类对象
注意“运行时”位,如“在执行时确定,而不是在编译时”
在这种情况下,我认为在toString()
的结果中返回执行时类名是完全合理的,但是如果您真的想要实体
类,您可以使用实体.class
。谢谢您的回答。是的,对于toString()
来说,这种方式很好,但有时调试会让人沮丧。:)刚开始的时候,它完全出乎我的意料。