正如标题所暗示的,我想理解为什么静态类只能有静态成员。我希望它在所有编程语言中都是一样的。所以我相信所有语言的解释都是一样的。
答案 0 :(得分:15)
静态类无法实例化,因此它不会有任何实例,非静态成员需要其类的实例才能访问。由于静态类不能有任何实例,因此如果存在任何实例,则无法访问非静态成员。
因此静态类只能有静态成员
答案 1 :(得分:7)
这不是一个设计决定,而是一个逻辑决策。最简单的起点是查看概念的相关定义:
静态类是无法实例化的类。这意味着您无法创建属于该类类型的对象。
非静态成员绑定到类的特定实例。它们包含专门与该类类型的单个对象关联的数据。
因此,如果静态类包含非静态成员,则永远不能访问该数据或调用该方法,因为您永远无法实例化该静态类的类型的对象。相反,您必须拥有可以从类的静态实例直接调用的所有静态成员。
但是,可以包含包含静态成员的非静态类。这样,您可以访问数据或调用作为静态成员公开的方法,而无需实例化该类的对象。但是,您也可以 实例化该类类型的对象并访问非静态(或实例)成员。例如,如果您有一个类Circle
,则可以使用静态成员,例如CalculateArea
函数和PI
字段。这些成员通常只适用于所有圈子,因为它们是圆圈。但是,您也可以拥有与该类的特定实例相关联的非静态成员,因为它们描述了特定的圈子对象。这些可以是字段Diameter
和Circumference
。在给定存储在该特定实例的非静态字段中的数据的情况下,您还可以使用非静态函数来计算圆的面积。
答案 2 :(得分:4)
无法实例化静态类。因此,永远无法访问非静态成员。
如果要混合和匹配静态成员,请不要使该类静态。
答案 3 :(得分:2)
大概是因为实例方法永远不会被调用。
答案 4 :(得分:1)
如果将非静态成员放在静态类中,则它不是静态类。 (你不能实例化一个静态类 - 拥有非静态成员,你必须能够创建调用这些成员的类的实例 - 这将使它成为常规类)
以另一种方式来看,通过将类标记为静态,您故意要求编译器不允许您在该类中放置非静态方法 - 这是您做出的设计决策,以及编译器帮助检查您是否遵循自己的设计。
答案 5 :(得分:-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");