2013-02-20 104 views
3

我有一个叫做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();

谁能解释为什么出现这种情况?

回答

7

你在致电getClass()。它总是返回对对象Class对象的引用,而不是对象的执行时类型的实际类型,而不是您调用它的表达式的编译时类型的类。因此,例如:

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

clazz将指类String,而不是类Object

你不需要看实施getClass() - 只看documentation

表示运行时类此对象的Class对象。

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

在这种情况下,我认为这是完全合理toString()结果中返回的执行时间的类名,但如果你真的真的Entity类,你可以只使用Entity.class代替。

+0

感谢您的回答。是的,它*很好,它可以用''toString()'这样的方式工作,但是对于调试有时令人沮丧。 :)它刚刚无视我对语言的期望。 – asteri 2013-02-20 17:21:01

相关问题