Actionscript 3: Может ли кто-нибудь объяснить мне концепцию статических переменных и методов? - PullRequest
11 голосов
/ 15 ноября 2009

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

Ответы [ 3 ]

26 голосов
/ 15 ноября 2009

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
  }
}
13 голосов
/ 15 ноября 2009

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

Так что в классе 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
0 голосов
/ 30 сентября 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...