正如標題所示,我想了解爲什麼靜態類只能有靜態成員。我希望它在所有的編程語言中都是一樣的。所以我相信所有語言的解釋都是一樣的。爲什麼靜態類只能有靜態成員?
回答
靜態類不能實例化,因此它不會有任何實例,非靜態成員會需要它們的類的實例來訪問。由於靜態類不能有任何實例,因此如果有靜態類,就不能訪問非靜態成員。
因此靜態類只能有靜態成員
大概是因爲實例方法可能永遠不會被調用。
如果你把一個非靜態成員放在一個靜態類中,它不會是一個靜態類。 (你不能實例化一個靜態類 - 要有非靜態成員,你必須能夠創建類的實例來調用這些成員 - 這將使它成爲一個普通類)
要看看它另一種方法是,通過將類標記爲靜態,您故意要求編譯器不要讓您將非靜態方法放入該類中 - 這是您做出的一項設計決策,編譯器可幫助檢查您是否遵循了自己的方法設計。
靜態類無法實例化。因此,非靜態成員永遠無法訪問。
如果要混合和匹配靜態成員,請不要使該類爲靜態。
這不是一個設計決定,而是一個合乎邏輯的決定。最容易開始的地方是查看概念的相關定義:
靜態類是一個無法實例化的類。這意味着您不能創建該類的類型的對象。
非靜態成員綁定到一個類的特定實例。它們包含與專有關聯的數據,其中包含該類類型的單個對象。因此,如果靜態類包含非靜態成員,則永遠不能訪問該數據或調用該方法,因爲您永遠不會實例化該靜態類的類型的對象。相反,您必須擁有所有可從該類的靜態實例直接調用的靜態成員。
但是,您可以具有包含靜態成員的非靜態類。這樣,您可以訪問數據或調用暴露爲靜態成員的方法,而無需實例化該類的對象。但是,您也可以也實例化該類的類型的對象並訪問非靜態(或實例)成員。例如,如果您有類Circle
,則可以使用靜態成員,如CalculateArea
函數和PI
字段。這些成員通常只適用於所有的圈子,因爲他們是圈子。但是您也可以擁有與該類別的特定實例相關聯的非靜態成員,因爲它們描述了特定的圓對象。這些可以是字段Diameter
和Circumference
。給定存儲在特定實例的非靜態字段中的數據,您也可以具有計算圓的面積的非靜態函數。
我不確定這是否相關,但(至少在c#.net 4.0中)靜態類可以包含包含非靜態成員的非靜態類定義。因此,您可以將非靜態成員添加到靜態類,因爲嵌套類型被認爲是member。
例子:
public static class MyClass
{
/// <summary>
/// This non-static class is accessible and able to be instantiated through the
/// static class MyClass.
/// </summary>
public class Type1
{
public String prop1 { get; set; }
public String funct1(String result)
{
return result;
}
}
/// <summary>
/// This function is inaccessible since it requires an instance of MyClass.
/// It will also cause a compile error.
/// </summary>
/// <returns></returns>
public String nonStaticFunc()
{
return "aString";
}
/// <summary>
/// This function is accessible through the MyClass type because it is also static
/// and therefore does not require a class instance.
/// </summary>
/// <returns></returns>
public static String staticFunc(String str)
{
return str;
}
}
正如你所看到的,靜態MyClass類有一個非靜態類定義的Type1必須爲了使用被實例化。而MyClass中的靜態函數staticFunc不需要訪問實例。
//Valid operations
String result = MyClass.staticFunc("result"); //No class instance.
MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");
- 1. C#靜態類 - 靜態類不能有非靜態成員
- 2. 爲什麼只有Java中的靜態內部類具有靜態成員?
- 3. 爲什麼我只能從靜態函數中訪問靜態成員?
- 4. 靜態類成員
- 5. 非靜態類的靜態成員?
- 6. 訪問靜態成員靜態成員
- 7. 類有什麼功能有自己的靜態成員?
- 8. 爲什麼類的靜態成員不能在C++中重載?
- 9. 爲什麼接口不能有靜態成員方法
- 10. 只有具有內部狀態的靜態成員的類
- 11. 靜態成員
- 12. 爲什麼靜態數據成員不能與非靜態數據成員具有相同的名稱?
- 13. PHP:從靜態類功能設置靜態成員
- 14. 爲什麼一個類允許自己擁有一個靜態成員,但不是一個非靜態成員?
- 15. 只有公共靜態成員
- 16. 類的靜態成員
- 17. 靜態類成員python
- 18. C++類的靜態成員
- 19. C++類的靜態成員
- 20. 訪問靜態成員類
- 21. 指向靜態類成員
- 22. 如何設置靜態類的私有靜態只讀數據成員?
- 23. 爲什麼我們可以有靜態最終成員,但不能在內部類中使用靜態方法?
- 24. 爲什麼非靜態的內部類不能有靜態成員(字段和方法)?
- 25. 靜態演員訪問靜態const類成員
- 26. 什麼是非靜態成員函數?
- 27. 靜態庫的靜態成員
- 28. 靜態成員vs靜態全局
- 29. 想從非靜態類訪問靜態成員的非靜態子類的Java
- 30. python類靜態方法動態綁定靜態數據成員
聽起來有點家庭作業......你有沒有想過這件事?有什麼目的可以允許靜態類中的非靜態成員? – mpen 2010-12-11 07:16:21
我知道規則'靜態類不能有非靜態成員'。但我想明白爲什麼。事實上,我期望在內存方面有更多令人討厭的答案,如何存儲靜態類和它們的成員以及如何存儲非靜態類和成員。 :) – NLV 2010-12-11 08:57:15