正如标题所示,我想了解为什么静态类只能有静态成员。我希望所有编程语言都是一样的。所以我相信所有语言的解释都是一样的。
静态类无法实例化,这意味着它们没有任何实例。非静态成员需要访问其类的实例。由于静态类不能拥有实例,因此您无法访问任何存在的非静态成员。
因此,静态类只能包含静态成员。
这不是一个设计决定,而是一个逻辑决定。最简单的起点是查看概念的相关定义:
静态类是无法实例化的类。这意味着您无法创建属于该类类型的对象。
非静态成员与类的特定实例相关联。它们包含与该类类型的单个对象“独占”关联的数据。 因此,如果静态类包含非静态成员,您将永远无法访问该数据或调用该方法,因为您永远无法实例化该静态类类型的对象。相反,您必须拥有可以直接从类的静态实例调用的所有
static成员。 但是,您
可以拥有包含静态成员的非静态类。这样,您可以访问数据或调用作为静态成员公开的方法,而无需实例化该类的对象。但是,您也可以实例化该类类型的对象并访问非静态(或实例)成员。例如,如果您有一个类 Circle
,您可以拥有静态成员,例如 CalculateArea
函数和
PI
字段。这些成员一般来说,仅仅因为它们是圈子,就适用于所有圈子。但您也可以拥有与该类的特定“实例”关联的非静态成员,因为它们描述“特定”圆形对象。这些可能是字段 Diameter
和 Circumference
。考虑到该特定实例的非静态字段中存储的数据,您还可以使用非静态函数来计算圆的面积。
静态类无法实例化。因此,永远无法访问非静态成员。如果您想混合和匹配静态成员,请勿将类设为静态。
如果将非静态成员放入静态类中,它就不是静态类。 (您无法实例化静态类 - 要拥有非静态成员,您必须能够创建类的实例来调用这些成员 - 这将使其成为常规类)
。
示例:
如您所见,静态类 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");