ActionScript 3: Может ли кто-нибудь объяснить мне концепцию статических переменных и методов?

Я изучаю AS3 и немного смущен относительно того, что делает статическая переменная или метод, или как он отличается от метода или переменной без этого ключевого слова. Я думаю, это должно быть достаточно простым, чтобы ответить.

Ответ 1

static указывает, что переменная, константа или метод принадлежит классу вместо экземпляров класса. static переменная, функция или константа могут быть доступны без создания экземпляра класса i.e SomeClass.staticVar. Они не наследуются каким-либо подклассом, и только классы (без интерфейсов) могут иметь статические элементы.
Функция A 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
  }
}

Ответ 2

Статическая переменная или метод совместно используются всеми экземплярами класса. Это довольно приличное определение, но на самом деле не может сделать это так же ясно, как пример...

Итак, в классе 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

Ответ 3

Другое дело, что статические функции могут обращаться только к статическим переменным и не могут быть переопределены, см. " hidden".