我試圖給自己一個static這個詞的映射想法(使用我當前的靜態名詞定義,對形容詞定義沒有很好的理解),但是看起來非靜態變量和方法實際上是「卡住「(或更好地說引用/引用)到對象/實例。那麼靜態實際描述的聲明方法/變量的術語是什麼?靜態是指「卡住」到什麼地方?
回答
詞語「靜態」和「動態」經常被用作編程術語對立。
動態的東西是變化的東西;在類的上下文中,它對每個實例(對象)都有不同的值或行爲。
靜態的東西不會改變;它處於停滯狀態。所以一個類的靜態變量對每個實例都不會有不同的值。
靜電不動;它被困在一個地方,在你的襪子上。在電線中運動的動態電力可以做更強大的事情。
我覺得這裏這個問題提供了一個非常詳細的解答: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"
可以看出,實例變量是一個由對象持有(或「實例」),因此,獨有的特定情況下,這在這個例子中是ac1
和ac2
所提及的對象。
另一方面,類變量只對整個類都是唯一的。爲了獲得跨更好這一點,讓我們添加一個新的方法將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
是一個實例方法,如可以通過爲可見通過參考實例ac1
和ac2
來調用,它們都返回相同的值42
。這是因爲在這兩種實例方法中,它們都引用類方法classVariable
,該方法對類是唯一的,而不是實例 - 對於類AnotherClass
,只有classVariable
的單個副本。
我希望有什麼澄清什麼static
修改的用途。
來自Sun的The Java Tutorials有一個名爲的部分,該部分也涉及兩種類型的變量和方法。
雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的重要部分,並提供供參考的鏈接。 – 2012-04-21 14:33:30
- 1. Box2d動態物體卡住靜態
- 2. 靜態在這裏指的是什麼
- 3. 什麼是「靜態」?
- 4. 爲什麼說方法不是靜態時它是靜態的?
- 5. https在S3靜態網站卡住
- 6. 爲什麼getAppProperty()不是靜態方法?
- 7. 什麼是靜態方法同步嗎?
- 8. 什麼是C#中的「靜態方法」?
- 9. 什麼是靜態方法和變量?
- 10. 非靜態...靜態是什麼?
- 11. 究竟是什麼SQL Server卡住?
- 12. 非靜態類中靜態方法的要點是什麼?
- 13. 本地化靜態文本asp.net mvc3.什麼是方法?
- 14. 爲什麼非靜態方法有額外的本地?還有,這是什麼?
- 15. 什麼是靜態ArrayList?
- 16. Java:什麼是靜態{}?
- 17. 爲什麼不是每種方法都是靜態方法?
- 18. 靜態方法和非靜態方法有什麼區別?
- 19. 靜態函數與類的靜態指針有什麼區別
- 20. 爲什麼要在靜態鏈接中指定地址?
- 21. 記住靜態值
- 22. 程序中變量的基地址/靜態地址是什麼?
- 23. ES6靜態方法是指自我?
- 24. 靜態方法是指非靜態成員?
- 25. LongClick狀態卡住
- 26. 什麼是靜態和動態鏈接
- 27. 卡住在java.net.SocketInputStream.socketRead0(本地方法)
- 28. 爲什麼從指針到基地的靜態播放到指向派生的指針「無效?」
- 29. 抓住什麼地方結果是在一段時間
- 30. 什麼是更好的:公共靜態類與靜態方法或公共類與靜態方法?
這取決於上下文。我們在談論什麼編程語言? – 2012-04-21 01:57:27
靜態「卡住」課程。非靜態是「卡住」類的實例。 – Jack 2012-04-21 02:03:59
@MattBall我指的是Java,但現在我更熟悉其他語言(JS,Python,Ruby),你會不會添加一個答案? – 2013-04-02 15:54:02