静的変数が、クラス全体に関係する情報を追跡するのに用いられることは既に学んだ通り。同様に、静的メソッド(static methods)は、単にそのクラスの個々のインスタンスの機能を定義するのではなく、クラスの全体としての振る舞いを定義する。
たとえば、FlashのランタイムAPIには、Pointという名前のクラスがある。直交点座標(座標平面)上の点を表現するクラスである。Pointクラスは、極座標ペアのデータ(距離と角度)を与えられると、Pointオブジェクトを生成する、polar()という静的メソッドを定義している(Point.polar()の解説 by Adobe)。
理論的に言って、極座標を直交点座標に変換することは、直交点座標に一般的に関連する処理であり、特定のPointオブジェクトに関連する処理ではない。それゆえに、polar()は静的メソッドとして定義されている。
インスタンスメソッドと同様、静的メソッドはクラスの中でfunction定義を用いて作られる。しかし、静的メソッドの定義には必ずstatic属性を含まなければならない。
例:
class SomeClass {
static function methodName (identifier = value) {
}
}
アクセスコントロール修飾子によってアクセス可能性を制御できる点、及び使用可能なアクセスコントロール修飾子の種類、アクセスコントロール修飾子のデフォルトがinternalである点は、いずれもインスタンスメソッドと同じである。アクセスコントロール修飾子はstatic属性の前につける。
例:
class SomeClass {
public static function methodName (identifier = value) {
}
}
静的メソッドを呼ぶには、以下のように書く。
SomeClass.methodName(value)
定義したクラスの内部であれば、静的メソッドは、クラス名を頭に付けなくても呼べる。
例:
SomeClass {
static function methodName (identifier = value) {
}
methodName(); // SomeClass.methodName(); と同じ
}
しかし、静的メソッドとインスタンスメソッドを区別するため、厳密には必要でなくとも、クラス名をつけて静的メソッドを呼ぶことが多い。
静的メソッドだけを定義しているクラスもある。そのようなクラスは、関連する機能をまとめるが、インスタンス化されることは無い。
たとえば、組み込みのMouseクラスはshow()とhide()という静的メソッドだけを定義している。これらはマウスポインターの表示・非表示を切り替えるのに使う。これらの静的メソッドは、Mouseクラスのインスタンスを通さず、Mouseクラスから直接アクセスできる(例:Mouse.show(), Mouse.hide())。Mouseクラスのオブジェクトが作られることは無い。
静的メソッドには、インスタンスメソッドには無い2つの制限がある。1つ目は、静的メソッドはthisキーワードを使えないということである。2つ目は、静的メソッドは同じクラス内で定義されているインスタンス変数とインスタンス変数にアクセス出来ないという点である。
(一方、インスタンスメソッドは静的変数や静的メソッドに加え、インスタンス変数や他のインスタンスメソッドにもアクセス出来る)
一般に、静的メソッドは静的変数に比べて使用される頻度は低い。
今日の進捗:307→312/2689