2010-12-11 68 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");