Platform: All
Version: Flash 9 and above/ActionScritp 3.0
シンタックス
class someClassName{
static var varName;
static const kName;
static function methodName() {
// ここにステートメントを記述
}
}
パラメータ
varName:* − 静的属性(static)を設定したい変数名。
kName:* − 静的属性(static)を設定したい定数名。
methodName:Function − 静的属性(static)を設定したいメソッド(function)名。
説明
変数(プロパティ)や定数、メソッドを、クラスのインスタンスでなく、クラスに直接帰属するものとして指定します。
静的クラスメンバ[*1]にアクセスするには、インスタンス名でなく、クラス名を用います。たとえば、Dateクラスにはparse()という静的メソッドがあります。このメソッドは、つぎのシンタックスでのみ呼出すことができます。
parse()メソッドを、Dateクラスのインスタンスに対して呼出すことはできません。たとえば、つぎのコードはエラーになります。
var myDate:Date = new Date();
myDate.parse("Jan 01 00:00:00 2006"); // エラー
|
staticは、クラス定義にのみ用いることが可能です。インタフェース定義には、使用できません。
静的クラスメンバは、継承されません。静的クラスメンバを、JavaやC++のように、サブクラス名を使って参照することはできません。ただし、静的変数(プロパティ)やメソッドを、そのクラスあるいはサブクラスから、何の指定もなしに参照することは可能です[*2]。以下の例をご覧ください。
superステートメントやthisキーワードは、静的メソッドの中で用いることはできません。
[注記] staticキーワードは、外部ActionScriptファイル内での使用のみがサポートされます。[アクション]パネルに記述したスクリプト内では、使うことはできません。
[訳者注*1] プロパティや定数、メソッドをまとめてメンバと呼びます。
[訳者注*2] この仕様は、ECMAScript 4にもとづきます。ECMAScript 4の仕様には、つぎのように明記されています。「他のオブジェクト指向言語(たとえばJava)とは異なり、基本クラスの静的プロパティは継承されません。ただし、静的プロパティは、派生クラスの静的ならびにインスタンスメソッド内のスコープには存在します」。
|
例
つぎの例は、staticキーワードを使ってカウンタを設定し、クラスのインスタンスがいくつ作成したかを記録する方法をご紹介します。numInstancesは静的変数ですので、インスタンスひとつずつについてではなく、クラス全体に対して1度だけ作成されます。新たなActionScriptファイルをUsers.asという名前で作成し、以下のコードを入力します[*3]。
package {
public class Users {
private static var numInstances:Number = 0;
public function Users() {
numInstances++;
}
public static function get instances():Number {
return numInstances;
}
}
}
|
つぎのコードを、User.asと同じ場所に保存したflaファイルのメインタイムラインに、フレームアクションとして記述します[*4][*5]。
trace(Users.instances);
var user1:Users = new Users();
trace(Users.instances);
var user2:Users = new Users();
trace(Users.instances);
|
つぎの例はUsersクラスを拡張して、静的変数(プロパティ)やメソッドが継承されないものの、サブクラスからの参照はできることを示します。クラスファイルPowerUsers.asは、Usersおよびflaファイルと同じ場所に保存します[*6]。
package {
public class PowerUsers extends Users {
public function PowerUsers() {
// 参照なしにスーバークラスの静的プロパティUsers.instancesにアクセスできる
trace(instances);
}
}
}
|
テスト用のスクリプトは、flaファイルのフレームアクションとして記述します[*6]。
var powerUser:PowerUsers = new PowerUsers(); // 出力: 1
trace(PowerUsers.instances); // エラー
// PowerUsersからスーパークラスの静的プロパティにはアクセスできない
|
[訳者注*3] 原文のスクリプトはつぎのとおりで、package定義やpublic属性の指定などがされていません。
class Users {
private static var numInstances:Number = 0;
function Users() {
numInstances++;
}
static function get instances():Number {
return numInstances;
}
}
|
[訳者注*4] 原文には、「つぎのコードを、スクリプトに入力します」とのみ記載されており、flaファイルに記述するのかクラスとして定義するのかが不明確です。
flaファイルに記述する場合には、本文で訳者が修正を加えたUsersクラス(Users.as)のように、クラスやメソッドにpublic指定する必要があります(前掲[訳者注*3]参照)。
Usersクラスやそのメソッドにpublic属性を指定せず、デフォルト(internal)のままにしておく場合には、User.asと同じ場所にたとえばつぎのようなドキュメントクラスMain.asを定義します。
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main() {
trace(Users.instances);
var user1:Users = new Users();
trace(Users.instances);
var user2:Users = new Users();
trace(Users.instances);
}
}
}
|
[訳者注*5] 出力結果は、つぎのようになります。
0
1
2
[訳者注*6] 原文のスクリプトは、つぎのとおりです。
class PowerUsers extends Users {
function PowerUsers() {
instances++; // unqualified reference to static property Users.instances is legal
}
}
trace(PowerUsers.instances); // error, cannot access static property using PowerUsers class
|
第1に、上記Usersクラスのinstances()にはgetterのみで、setterメソッドが定義されていません。したがって、PowerUsers()コンストラクタ内のinstancesをインクリメントする処理はエラーになります。
第2に、PowerUsers()コンストラクタが呼出されれば、super()が内部的に実行され、スーパークラスUsers()コンストラクタも自動的に呼出されます。Users()コンストラクタは、getterメソッドinstances()が返すprivateプロパティnumInstancesをインクリメントします。したがって、サブクラスのUsers()コンストラクタでもインクリメントすれば、サブクラスのインスタンスを生成するたびに2ずつ加算される結果になります。このような処理は、テストに不要でしょう。
そこで、訳者の修正した本文のサンプルスクリプトでは、getterメソッドによりinstancesの値をtrace()するのみとしました。また、原文にないPowerUsers()コンストラクタによるインスタンス作成のステートメントを加えています。
|
Player
ActionScript 3.0/Flash Player 9以降。
出典
[ActionScript 3.0 Language Reference] > [Statements, Keywords & Directives] > [static attribute keyword]
作成者: 野中文雄
更新日: 2007年1月4日 [訳者注*2]を追加
作成日: 2006年12月29日