为什么静态类只能拥有静态成员?

7

正如标题所示,我想了解为什么静态类只能有静态成员。我希望在所有编程语言中都是相同的。因此,我相信解释对于所有语言来说都是相同的。


3
听起来有点像作业... 你考虑清楚了吗?在静态类中允许非静态成员有什么目的呢? - mpen
我知道“静态类不能有非静态成员”的规则。但我想了解为什么。实际上,我期望更多关于内存方面的极客答案,例如静态类及其成员如何存储以及非静态类和成员如何存储。 :) - NLV
6个回答

15

静态类无法被实例化,因此它将不会有任何实例,非静态成员需要其所属类的实例才能访问。由于静态类不能有任何实例,如果存在非静态成员,则无法访问。

因此,静态类只能拥有静态成员。


7
这不是一个设计决策,而是一个逻辑决策。开始的最简单方法是查看相关概念的定义:
静态类是不能实例化的类。这意味着您不能创建属于该类类型的对象。
非静态成员与类的特定实例相关联。它们包含与该类类型的一个单一对象独占关联的数据。
因此,如果静态类包含非静态成员,您永远无法访问该数据或调用该方法,因为您永远无法实例化该静态类类型的对象。相反,您必须拥有所有可以直接从类的静态实例调用的静态成员。
但是,您可以拥有包含静态成员的非静态类。这样,您就可以访问公开为静态成员的数据或调用方法,而无需实例化该类的对象。但是,您也可以实例化该类类型的对象并访问非静态(或实例)成员。例如,如果您有一个名为Circle的类,则可以具有像CalculateArea函数和PI字段这样的静态成员。通常情况下,这些成员适用于所有圆形,仅仅因为它们是圆形。但是,您还可以具有与特定实例相关联的非静态成员,因为它们描述了特定圆形对象。这些可以是字段DiameterCircumference。您还可以具有非静态函数,该函数根据存储在该特定实例的非静态字段中的数据计算圆的面积。

4

静态类不能被实例化,因此无法访问非静态成员。

如果你想混合使用静态成员和非静态成员,请不要将类定义为静态的。


2

可能是因为实例方法永远无法被调用。


1
如果您将非静态成员放入静态类中,则它将不再是静态类。(您无法实例化静态类 - 要拥有非静态成员,您必须能够创建该类的实例以调用这些成员 - 这将使其成为常规类)
换句话说,通过将类标记为静态,您故意要求编译器不允许您在该类中放置非静态方法 - 这是您自己做出的设计决策,编译器有助于检查您是否遵循自己的设计。

-1

我不确定这是否相关,但是(至少在c# .net 4.0中),静态类可以包含非静态类定义,其中包含非静态成员。因此,似乎您可以向静态类添加非静态成员,因为嵌套类型被视为成员

例如:

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接