2010-12-11 118 views
7

正如標題所示,我想了解爲什麼靜態類只能有靜態成員。我希望它在所有的編程語言中都是一樣的。所以我相信所有語言的解釋都是一樣的。爲什麼靜態類只能有靜態成員?

+3

聽起來有點家庭作業......你有沒有想過這件事?有什麼目的可以允許靜態類中的非靜態成員? – mpen 2010-12-11 07:16:21

+0

我知道規則'靜態類不能有非靜態成員'。但我想明白爲什麼。事實上,我期望在內存方面有更多令人討厭的答案,如何存儲靜態類和它們的成員以及如何存儲非靜態類和成員。 :) – NLV 2010-12-11 08:57:15

回答

14

靜態類不能實例化,因此它不會有任何實例,非靜態成員會需要它們的類的實例來訪問。由於靜態類不能有任何實例,因此如果有靜態類,就不能訪問非靜態成員。

因此靜態類只能有靜態成員

2

大概是因爲實例方法可能永遠不會被調用。

1

如果你把一個非靜態成員放在一個靜態類中,它不會是一個靜態類。 (你不能實例化一個靜態類 - 要有非靜態成員,你必須能夠創建類的實例來調用這些成員 - 這將使它成爲一個普通類)

要看看它另一種方法是,通過將類標記爲靜態,您故意要求編譯器不要讓您將非靜態方法放入該類中 - 這是您做出的一項設計決策,編譯器可幫助檢查您是否遵循了自己的方法設計。

4

靜態類無法實例化。因此,非靜態成員永遠無法訪問。

如果要混合和匹配靜態成員,請不要使該類爲靜態。

7

這不是一個設計決定,而是一個合乎邏輯的決定。最容易開始的地方是查看概念的相關定義:

靜態類是一個無法實例化的類。這意味着您不能創建該類的類型的對象。

非靜態成員綁定到一個類的特定實例。它們包含與專有關聯的數據,其中包含該類類型的單個對象。因此,如果靜態類包含非靜態成員,則永遠不能訪問該數據或調用該方法,因爲您永遠不會實例化該靜態類的類型的對象。相反,您必須擁有所有可從該類的靜態實例直接調用的靜態成員。

但是,您可以具有包含靜態成員的非靜態類。這樣,您可以訪問數據或調用暴露爲靜態成員的方法,而無需實例化該類的對象。但是,您也可以實例化該類的類型的對象並訪問非靜態(或實例)成員。例如,如果您有類Circle,則可以使用靜態成員,如CalculateArea函數和PI字段。這些成員通常只適用於所有的圈子,因爲他們是圈子。但是您也可以擁有與該類別的特定實例相關聯的非靜態成員,因爲它們描述了特定的圓對象。這些可以是字段DiameterCircumference。給定存儲在特定實例的非靜態字段中的數據,您也可以具有計算圓的面積的非靜態函數。

-1

我不確定這是否相關,但(至少在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");