2013-12-16 153 views
6

Sup球員,我有一個簡單的,但有問題的問題。 據我所知,static基本上意味着,對於該類的每個單一實例,如果我們改變它,這個方法將是相同的,這將隨着該類的每個單個實例而改變,它也被稱爲類方法。好吧,如果我有一個實現toString()方法巫婆一定的格式類,比方說:爲什麼toString()不能是一個靜態方法?

public String toString() { 
    return "(" + x + "," + y + ")"; 
} 

爲什麼不能將它設置爲靜態的?既然這個格式對於那個類的每一個實例都是一樣的......?

+6

想想x和y。如果它們是非靜態字段,則靜態方法不能訪問它們。 –

+0

@PatriciaShanahan所以你說,如果x和y是靜態值,toString()方法可以設置爲靜態? –

+0

你對「靜態」的理解略有偏差。 'static'意味着只創建一個實例(至少對於變量)。你甚至可以在不實例化一個對象的情況下訪問'static'變量/方法(例如'ClassName.toString()'。另外,你不必爲每個對象創建一個新的方法;它們都有相同的方法可用 – Justin

回答

8

這並不僅僅適用於toString()

Java Language Specification

這是一個編譯時錯誤,如果一個靜態方法hides實例 方法。

由於實例方法toString()被隱式地從Object繼承,在一個子類型聲明的方法toString()作爲static導致編譯時間錯誤。

從面向對象的角度來看,請參閱此問題的其他答案或related問題。

+0

在這種情況下,它適用於'equals()','hashCode()'等 – Justin

+0

@Quincunx是的,任何可見的實例方法。 –

4

由於靜態方法無法訪問實例字段。另外,toString()java.lang.Object指定,因此您必須擁有Object的實例才能調用toString()。最後,如果toString()是靜態的,它將不得不接受Object的實例(你還可以在類的n個實例上調用toString()方法嗎?)。

相關問題