为什么在父方法中返回子类名称?
问题描述:
我有一个叫做Entity
的类,它是我在整个程序中使用的许多其他对象的超类(类)。为什么在父方法中返回子类名称?
在许多方法中,我通过打印语句打印的类名打印调试语句,然后打印实际的调试消息。但令我惊讶的是,当我从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:
表示运行时类此对象的Class对象。
请注意“运行时间”位,如“在执行时确定,不在编译时”。
在这种情况下,我认为这是完全合理到toString()
结果中返回的执行时间的类名,但如果你真的真的想的Entity
类,你可以只使用Entity.class
代替。
感谢您的回答。是的,它*很好,它可以用''toString()'这样的方式工作,但是对于调试有时令人沮丧。 :)它刚刚无视我对语言的期望。 – asteri 2013-02-20 17:21:01