我有一个名为“Entity”的类,它是我在程序中使用的许多其他对象(例如“Apple”类)的抽象超类。
在许多方法中,我通过先打印语句所在的类名,然后再打印实际的调试信息来打印调试语句。但令我惊讶的是,当我从“Apple”类的实例中调用继承的方法时,打印的是“Apple”的类名,而不是实际位于“Entity”中的方法的类名。
以一个更容易发布代码片段的相关示例为例,我已按以下方式重写了“toString()”:
因为我没有在
我尝试查看
可以有人解释一下为什么会发生这种情况吗?
在许多方法中,我通过先打印语句所在的类名,然后再打印实际的调试信息来打印调试语句。但令我惊讶的是,当我从“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
方法,所以无法查看其实现。可以有人解释一下为什么会发生这种情况吗?
toString()
这样工作确实很好,但有时在调试时会令人沮丧。 :) 而且一开始它违背了我的语言预期。 - asteri