根据我的理解,静态成员属于该类,而不属于该类的特定实例。如果所有实例共享具有完全相同值的特定特征,或者如果我根本不想创建该类的任何实例,则它可能是有用的。
所以,如果我有一个类Car
,并且我的所有汽车将总是有4个轮子,我可以将轮子的数量存储为类Car
的静态成员,而不是作为myCar
类实例的实例变量。
但是为什么在Haxe中不可能从类实例访问静态变量?对我没有任何意义。
class Car
{
public static var noOfWheels:Int = 4;
public static function getNoOfWheels():Int
{
return Car.noOfWheels;
}
}
class Main
{
static function main()
{
myCar = new Car();
trace (myCar.noOfWheels);
trace (myCar.getNoOfWheels());
trace (Type.getClass(myCar).noOfWheels);
}
}
这些痕迹都不会导致期望的结果。第一个和第二个跟踪导致类型错误:
无法从类实例访问静态字段XY
而第三个导致:
Class <Car>没有字段noOfWheels
编辑以澄清:
我有几个Car
类的子类,继承了它的所有属性。在某些情况下,像类ItalianVan
,我再次声明静态变量noOfWheels
,从而使原来的Car.noOfWheels
黯然失色。
class ItalianVan extends Car
{
public static var noOfWheels:Int = 3;
}
现在,如果我有一个任意的汽车实例,我想知道它有多少个轮子。如果我进入Car.noOfWheels
,答案将永远是4个轮子,即使那辆特殊的车实际上是一辆三轮意大利面包车。
也许答案是:不要为这样的东西使用静态变量!但这对我来说并不明显。如果该类的所有成员具有相同数量的轮子,似乎没有必要使noOfWheels
成为实例变量。
我从未使用过Haxe,但我可以看到你正在访问myCar
变量。试试这个:
trace (Car.noOfWheels);
trace (Car.getNoOfWheels());
如果要访问静态变量,则应使用类名。
要从实例访问静态变量,您可以添加一个非静态方法来返回静态调用的结果。