2013-02-20 146 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

相關問題