2013-10-31 70 views
3

我真的不能理解靜態方法。我閱讀了許多文章,並在教科書和Java文檔中看過它。我知道你可以使用靜態方法來訪問靜態變量。除了得到一個靜態變量之外,是否還有類方法的其他原因?如果還有其他原因,我可以解釋一下爲什麼?我做這個線程也是因爲我沒有在SOF中找到任何關於這個的東西。是否有靜態方法的原因?

下面是一個例子代碼:

public class Bicycle { 

    private int cadence; 
    private int gear; 
    private int speed; 

    private int id; 

    private static int numberOfBicycles = 0; 


    public Bicycle(int startCadence, 
        int startSpeed, 
        int startGear){ 
     gear = startGear; 
     cadence = startCadence; 
     speed = startSpeed; 

     id = ++numberOfBicycles; 
    } 

    public int getID() { 
     return id; 
    } 

    public static int getNumberOfBicycles() { 
     return numberOfBicycles; 
    } 

    public int getCadence(){ 
     return cadence; 
    } 

    public void setCadence(int newValue){ 
     cadence = newValue; 
    } 

    public int getGear(){ 
    return gear; 
    } 

    public void setGear(int newValue){ 
     gear = newValue; 
    } 

    public int getSpeed(){ 
     return speed; 
    } 

    public void applyBrake(int decrement){ 
     speed -= decrement; 
    } 

    public void speedUp(int increment){ 
     speed += increment; 
    } 
} 
+0

基本上它叫封裝:http://gmoeck.github.io/2011/09/20/why-you-should-care-about-encapsulation.html和http://java.dzone.com /用品/爲什麼封裝-事項 –

回答

5

實例方法可以訪問類變量,以及。

一個很好的例子是一個實用程序類:當你需要做一件快事時,你會做什麼,但是創建一個對象會很麻煩?沒錯:靜態方法。

public static class Utils { 
public static void DoSomething(SomeClass x) { } 
} 

這樣,我們只需調用,而不是Utils.DoSomething(myObject);

Utils util = new Utils(); 
util.DoSomething(myObject); 

或者,在你的榜樣,它讓多少自行車總數將創建一個計數。通過將它保存在類級別上,它將保持變量在所有對象之間同步的狀態。

3

按類你是指我假設的靜態?您可以爲實用程序類使用靜態方法。它使你不必實例化一個類來訪問一個方法。例如,我可以編寫一個方法來計算名爲getNumOfLetters的String中的字母數,並使用StringUtil.getNumOfLetters來調用它,假定String utils是類的名稱。

2

通常書籍告訴你像「班級就像對象的藍圖」。但我喜歡將課程視爲物體的「工廠」。 (不要與「工廠模式」混淆,雖然有相似之處!)

在這個例子中,您可以將您的班級視爲「自行車工廠」。您可能想要執行stopProducingBicycles()getTotalBicyclesCount()。或者更有趣的東西:setNewBicycleColor(red)

遵循setNewBicycleColor()的思想 - 沒有什麼能夠阻止您在構造函數中訪問類的靜態屬性,例如, 「顏色」,以便所有新的自行車都有默認顏色「紅色」。

您可能希望保留每個新自行車在您的班級(這將是一個靜態屬性)的參考。然後,在某些時候,你可能會做Bicycle.AllInstanciesSelfDestruct() :)

1

方法不只是訪問類的數據,而且還manipulating data

2

,是否確有其他原因,而不是讓一個類變量其他類的方法?

由「類方法」你指的是靜態方法假設,有任意數量的他們的用途。除了公開全局常量或共享數據之外,它們可能最常用於不需要在對象實例的上下文中執行的實用函數。

例如:像排序,倒車等

  1. 集合相關的操作(見:java.util.Collections

  2. 固定數學函數(見:java.lang.Math

  3. 包裝器用於其他操作具有定義良好的空參數行爲(請參閱:java.util.Objects::equals()而不是java.lang.Object::equals()

工廠方法是另一種流行的用例。工廠方法執行類似的職責,構造函數,但允許一些額外的靈活性:

  1. 它們可以具有更多的描述性名稱,也許通信的(多個)對象的預期目的進行構造。

  2. 它們可以返回一個基本類型,並根據作爲參數傳遞的內部邏輯和/或選項/提示來決定要實例化哪個具體類型。

  3. 許多具體類型的工廠方法可以在一個地方組合在一起,提高了可發現性。有關示例,請參見java.util.concurrent.Executors

相關問題