2012-04-21 30 views
0

我試圖給自己一個static這個詞的映射想法(使用我當前的靜態名詞定義,對形容詞定義沒有很好的理解),但是看起來非靜態變量和方法實際上是「卡住「(或更好地說引用/引用)到對象/實例。那麼靜態實際描述的聲明方法/變量的術語是什麼?靜態是指「卡住」到什麼地方?

+1

這取決於上下文。我們在談論什麼編程語言? – 2012-04-21 01:57:27

+1

靜態「卡住」課程。非靜態是「卡住」類的實例。 – Jack 2012-04-21 02:03:59

+0

@MattBall我指的是Java,但現在我更熟悉其他語言(JS,Python,Ruby),你會不會添加一個答案? – 2013-04-02 15:54:02

回答

2

詞語「靜態」和「動態」經常被用作編程術語對立。

動態的東西是變化的東西;在類的上下文中,它對每個實例(對象)都有不同的值或行爲。

靜態的東西不會改變;它處於停滯狀態。所以一個類的靜態變量對每個實例都不會有不同的值。

靜電不動;它被困在一個地方,在你的襪子上。在電線中運動的動態電力可以做更強大的事情。

1

我覺得這裏這個問題提供了一個非常詳細的解答:What is "static"?

static概念有東西是否是類或對象(實例)的一部分來做。

對於main方法聲明爲static的情況,它表示main方法是一個類方法 - 類是類的一部分,而不是對象的一部分。這意味着另一個類可以通過參考ClassName.method來調用另一個類的類方法。例如,調用的MyClass run方法將通過以下步驟完成:

MyClass.main(new String[]{"parameter1", "parameter2"}); 

在另一方面,如果沒有static改性劑的方法或字段意味着它是一個對象的一部分(或也稱爲「實例」)而不是班級的一部分。

MyClass c1 = new MyClass(); 
c1.getInfo()  // "getInfo" is an instance method of the object "c1" 

由於每個實例可以具有不同的值,的方法的值或字段的:它是由具體的目的是該方法或字段屬於,而不是類名的名稱稱爲在不同的對象相同的名稱不一定是相同的:

MyClass c1 = getAnotherInstance(); 
MyClass c2 = getAnotherInstance(); 

c1.value  // The field "value" for "c1" contains 10. 
c2.value  // The field "value" for "c2" contains 12. 
      // Because "c1" and "c2" are different instances, and 
      // "value" is an instance field, they can contain different 
      // values. 

結合實例和類變量的兩個概念。比方說,我們聲明包含實例和類變量和方法的新類:

class AnotherClass { 
    private int instanceVariable; 
    private static int classVariable = 42; 

    public int getInstanceVariable() { 
     return instanceVariable; 
    } 

    public static int getClassVariable() { 
     return classVariable; 
    } 

    public AnotherClass(int i) { 
     instanceVariable = i; 
    } 
} 

上面這個類有一個實例變量instanceVariable和類變量classVariable其聲明與static修改。同樣,有一個實例和類方法來檢索值。

實例的構造函數將一個值作爲參數分配給實例變量。類變量初始化爲42並且從未更改過。

讓我們實際使用上面的類,看看會發生什麼:

AnotherClass ac1 = new AnotherClass(10); 

ac1.getInstanceVariable();    // Returns "10" 
AnotherClass.getClassVariable();  // Returns "42" 

通知方式的不同類和實例方法被調用。它們以名稱AnotherClass引用該類的方式或名稱爲ac1的實例。讓我們進一步去看看這些方法的行爲差異:

AnotherClass ac1 = new AnotherClass(10); 
AnotherClass ac2 = new AnotherClass(20); 

ac1.getInstanceVariable();    // Returns "10" 
AnotherClass.getClassVariable();  // Returns "42" 
ac2.getInstanceVariable();    // Returns "20" 
AnotherClass.getClassVariable();  // Returns "42" 

可以看出,實例變量是一個由對象持有(或「實例」),因此,獨有的特定情況下,這在這個例子中是ac1ac2所提及的對象。

另一方面,類變量只對整個類都是唯一的。爲了獲得跨更好這一點,讓我們添加一個新的方法將AnotherClass

public int getClassVariableFromInstance() { 
    return classVariable; 
} 

然後,運行以下命令:

AnotherClass ac1 = new AnotherClass(10); 
AnotherClass ac2 = new AnotherClass(20); 

ac1.getInstanceVariable();    // Returns "10" 
ac1.getClassVariableFromInstance(); // Returns "42" 
ac2.getInstanceVariable();    // Returns "20" 
ac2.getClassVariableFromInstance(); // Returns "42" 

雖然getClassVariableFromInstance是一個實例方法,如可以通過爲可見通過參考實例ac1ac2來調用,它們都返回相同的值42。這是因爲在這兩種實例方法中,它們都引用類方法classVariable,該方法對類是唯一的,而不是實例 - 對於類AnotherClass,只有classVariable的單個副本。

我希望有什麼澄清什麼static修改的用途。

來自Sun的The Java Tutorials有一個名爲的部分,該部分也涉及兩種類型的變量和方法。

+0

雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的重要部分,並提供供參考的鏈接。 – 2012-04-21 14:33:30