クラス変数
本節ではスクリプト言語であるRubyでクラス変数の概略を記す。Rubyにおいては、@@で始まる変数がクラス変数となる。
なお、Rubyにおいてはクラス自身もClassクラスのインスタンスであるので、そのインスタンス変数(クラスインスタンス変数)も存在する。「クラスに属する変数」という意味で両者は共通するが、クラスインスタンス変数はインスタンスメソッドから直接使うことができないなど、機能としては別である。
本節では、Javaにおけるクラス変数の例を記す。
Javaにおいては、static修飾子を使うことでクラス変数を宣言できる。下記の例において、2行目で宣言されているfooはクラス変数であり、3行目で宣言されているbarはインスタンス変数である。冒頭でも説明されているように、クラス変数は同一クラスと派生クラスで共有される。ただし、クラス変数のアクセスレベルがprivateの場合、あるいはアクセスレベルがパッケージプライベート(デフォルト)で、派生クラスがパッケージ外にある場合は、派生クラスから参照することはできない。
このHogeクラスを実際に使用する例:
実行結果
この例ではインスタンス変数との違いを示すためにインスタンス変数barを用意した。
クラス変数Hoge.fooとhoge.fooとanother.fooはすべて同一のものであるためどれかに値を代入するとどれを参照しても代入された値となる。この例ではまずHoge.fooに100を代入した。当然100を出力する。hoge.fooはHoge.fooとクラス変数を参照しているため100を出力する。次にhoge.fooに700を代入する。Hoge.fooもhoge.fooもどちらも700を出力する。次に新たにインスタンスanotherを生成する。another.fooに777を代入しanother.barには888を代入する。このとき、当然another.fooは777、another.barは888を出力する。ただし、Hoge.foo、hoge.fooの値は、Hogeクラスで共有されているクラス変数であるためどちらも777になっている。hoge.barは異なるインスタンスの変数であるため800のままである。