动作脚本3:有人可以向我解释静态变量和方法的概念吗?

时间:2009-11-15 18:23:40

标签: actionscript-3

我正在学习AS3,对于静态变量或方法的作用,或者它与没有此关键字的方法或变量的区别,我感到有点困惑。我认为这应该足够简单回答。

3 个答案:

答案 0 :(得分:26)

static指定变量,常量或方法属于类而不是类的实例。可以访问static变量,函数或常量,而无需创建类的实例,即SomeClass.staticVar。它们不是由任何子类继承的,只有类(没有接口)才能有静态成员。
static函数不能访问类的任何非静态成员(变量,常量或函数)而你不能在静态函数中使用thissuper。这是一个简单的例子。

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”。