Я изучаю AS3 и немного смущен относительно того, что делает статическая переменная или метод, или как он отличается от метода или переменной без этого ключевого слова. Я думаю, это должно быть достаточно простым, чтобы ответить.
ActionScript 3: Может ли кто-нибудь объяснить мне концепцию статических переменных и методов?
Ответ 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".