我正在学习AS3,对于静态变量或方法的作用,或者它与没有此关键字的方法或变量的区别,我感到有点困惑。我认为这应该足够简单回答。
答案 0 :(得分:26)
static
指定变量,常量或方法属于类而不是类的实例。可以访问static
变量,函数或常量,而无需创建类的实例,即SomeClass.staticVar
。它们不是由任何子类继承的,只有类(没有接口)才能有静态成员。
static
函数不能访问类的任何非静态成员(变量,常量或函数)而你不能在静态函数中使用this
或super
。这是一个简单的例子。
public class SomeClass
{
private var s:String;
public static constant i:Number;
public static var j:Number = 10;
public static function getJ():Number
{
return SomeClass.j;
}
public static function getSomeString():String
{
return "someString";
}
}
在TestStatic中,可以访问静态变量和函数,而无需创建SomeClass的实例。
public class TestStaic
{
public function TestStaic():void
{
trace(SomeClass.j); // prints 10
trace(SomeClass.getSomeString()); //prints "someString"
SomeClass.j++;
trace(SomeClass.j); //prints 11
}
}
答案 1 :(得分:13)
静态变量或方法由类的所有实例共享。这是一个相当不错的定义,但实际上可能并没有像一个例子那样明确......
因此,在类Foo
中,您可能希望使用静态变量fooCounter
来跟踪已实例化的Foo
个数。 (我们暂时忽略线程安全性。)
public class Foo {
private static var fooCounter:int = 0;
public function Foo() {
super();
fooCounter++;
}
public static function howManyFoos():int {
return fooCounter;
}
}
因此,每次在上面的示例中创建new Foo()
时,计数器都会递增。因此,如果我们想知道有多少Foo
,我们不会在实例中询问计数器的值,我们会询问Foo
类,因为该信息是“静态的” “并适用于整个Foo
课程。
var one:Foo = new Foo();
var two:Foo = new Foo();
trace("we have this many Foos: " + Foo.howManyFoos()); // should return 2
答案 2 :(得分:0)
另一件事是静态函数只能访问静态变量,而无法覆盖,请参阅“hidden”。