2013-04-17 58 views
2

我知道如何使用物體..但有一件事特別讓我撓頭。
靜態方法。靜態對象如何工作?

我舉個例子。

Toolkit theKit = Toolkit.getDefaultToolkit(); 

我認爲theKit對象現在持有new Toolkit();類..但林不知道。

此外我現在可以用theKit參考變量做theKit.getScreenResolution();

是因爲Thetoolkit類它自己包含該方法嗎?

原諒我,現在我已經寫出了所有這些看起來很明顯,但無論如何都不好問。謝謝。

+0

你回答自己的問題..Toolkit.getDefaultToolkit()相當於新的Toolkit();它就像單身人士 –

+1

@Arun沒有必要(你可以在這個黑盒子方法中有'foo(); ... bar();返回新的Toolkit();')。 –

+2

@阿倫「等值」不是正確的詞。在這個方法中還有很多不僅僅是返回新的Toolkit()。 – Dukeling

回答

1

這是一個設計模式。現在考慮到這種情況,Toolkit仍然是單身人士。 因此,圖書館設計師確保它本身仍然是單身人士提供一種方法,以getDefaultToolkit

getDefaultToolkit返回可供圖書館用戶使用的Toolkit

我們提供訪問這樣的方法,給出一個斜面初始化通過「新的工具包Toolkit()`,該庫提供了一個靜態方法,這使得對它的訪問

+1

我不認爲它以某種方式清除任何東西 –

+1

不一定是一個單身人士。 –

+0

是的。但'Toolkit'是一個單身人士。因此,該方法用於返回它 – Jatin

5

static方法屬於該類。不是這個例子。
與所有static成員變量相同。
所以你不需要創建一個對象的實例來使用該方法。由於它屬於類,所以您只需通過類名來訪問它。
static方法的常見用法是實用方法。您不使用對象(在您的類層次結構設計中存在具體對象可能沒有意義),因此您通過類訪問方法

+0

非常感謝你的回覆。這確實有幫助。 –

1

我可以有一個靜態方法,確實創建一個類的實例。靜態方法不屬於一個實例,而是屬於類本身,所以你不需要讓一個類的實例使用它的靜態方法。簡單的例子:

public class MyClassExample(){ 

public static MyClassExample getDefaultInstance(){ 
return new MyClassExample(); 
} 

} 

然後你就可以實例MyClassExample這樣:

MyClassExample example = MyClassExample.getDefaultInstance(); 
1
Toolkit theKit = Toolkit.getDefaultToolkit(); 

上面一行是factory技術來獲得Class實例和getDefaultToolkit()是一個工廠方法,這是很明顯一個靜態方法(所以你直接使用類名來調用),它將返回類的實例(在你的情況下它是Toolkit類)。我們也使用這種技術來處理單例。

關於你的問題,是的,因爲類包含方法getScreenResolution(),所以你可以調用它,這是顯而易見的。

1

Toolkit.getDefaultToolkit()是一個靜態工廠幫助方法來獲取ToolKit類的實例。 'theKit'是一個有效的實例,當你使用new創建對象實例時,你可以像使用它一樣使用它。有了這樣的輔助方法是有效的Java書中提到的最佳實踐「考慮靜態工廠方法而不是構造

1

方法getDefaultToolkit()static,這意味着你不需要Toolkit類的一個實例化對象訪問這種方法。當JVM知道該類時,它就在那裏,並且可以始終訪問靜態方法。這是因爲他們永遠不會改變!他們不會改變他們的狀態,他們將永遠不會做別的事情,但在這種情況下返回一個對象。

這裏我說了。在內部我猜測Toolkit.getDefaultToolkit()確實是這樣的方法:

public Toolkit getDefaultToolkit(){ 
    return new Toolkit(); 
} 

那麼這將是太容易了,但內的靜態方法某處的對象將被創建並返回。

所以之後你的變量theKid實際上持有對真實Object的引用。一個非靜態的實例,可以改變和做事情..例如與方法theKit.getScreenResolution()它可以給你當前屏幕的分辨率..不僅僅是a分辨率..但是確切的分辨率(每設備與每個屏幕) - 意味着此方法不能是靜態的,但需要一個對象。