gpt4 book ai didi

java - 为什么在父方法中返回子类名?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:29:16 24 4
gpt4 key购买 nike

我有一个类叫做 Entity这是一个abstract我在整个程序中使用的许多其他对象的父类(super class)(对于本示例,Apple 类)。

在许多方法中,我通过打印语句所在的类名来打印调试语句,然后是实际的调试消息。然而,令我惊讶的是,当我从 Apple 的实例调用继承的方法时, Apple 的类名被打印而不是 Entity 的类名(这是方法实际所在的位置)。

举一个更容易发布代码片段的相关示例,我已经覆盖了 toString()像这样:

public abstract class Entity {

private String name;

@Override
public String toString() {
return getClass().getSimpleName() + " " + (name != null ? name : super.hashCode());
}
}

因为我没有在 Apple 中进一步覆盖此方法类,我希望返回的字符串的第一部分是 Entity , 不是 Apple .然而它返回 Apple (对于这个用例,它以这种方式工作实际上很好,但仍然有些令人费解)。

我试着查看 Object#getClass() 的实现, 但不能,因为它被声明为 native方法。

public final native Class<?> getClass();

谁能解释为什么会这样?

最佳答案

您正在调用 getClass()。这总是返回对 Class 对象的引用,该对象与对象的实际 执行时类型关联,而不是您调用它的表达式的编译时类型的类在。例如:

Object foo = "this is a string";
Class<?> clazz = foo.getClass();

clazz 将引用 String 的类,而不是 Object 的类。

您不需要查看 getClass()实现 - 只需查看 documentation :

The Class object that represents the runtime class of this object.

请注意“运行时”位,如“在执行时确定,而不是在编译时确定”。

在这种情况下,我认为在 toString() 的结果中返回执行时类名是完全合理的,但是如果你真的真的 想要 Entity 类,您可以改用 Entity.class

关于java - 为什么在父方法中返回子类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com