クラス変数

クラス変数 () または、静的メンバ変数 ()、静的フィールド () とは、同一クラス・派生クラスで共有される変数である。そのため、関連クラスに渡って共通に使用できるグローバル変数（大域変数）であるともいえる。
これに対して、インスタンスごとに確保される変数のことを、インスタンス変数あるいは単にフィールド (計算機科学)、データメンバ、メンバ変数などと呼ぶ。 
UMLではクラス変数のことを、特別な意味を持つ属性としてクラススコープ () と呼ぶ。
Ruby.
本節ではスクリプト言語であるRubyでクラス変数の概略を記す。Rubyにおいては、@@で始まる変数がクラス変数となる。
class A
@@n="Default Value"
 def printClassVariable
 p @@n
 end
 def setClassVariable(var)
 @@n=var
 end
end
class B < A
end
class C < B
end
a = A.new
b = B.new
c = C.new
a.printClassVariable #=> Default Value
b.printClassVariable #=> Default Value
c.printClassVariable #=> Default Value
a.setClassVariable("Value is changed")
a.printClassVariable #=> Value is changed
b.printClassVariable #=> Value is changed
c.printClassVariable #=> Value is changed
なお、Rubyにおいてはクラス自身もClassクラスのインスタンスであるので、そのインスタンス変数（クラスインスタンス変数）も存在する。「クラスに属する変数」という意味で両者は共通するが、クラスインスタンス変数はインスタンスメソッドから直接使うことができないなど、機能としては別である。
Java.
本節では、Javaにおけるクラス変数の例を記す。
Javaにおいては、static修飾子を使うことでクラス変数を宣言できる。下記の例において、2行目で宣言されているfooはクラス変数であり、3行目で宣言されているbarはインスタンス変数である。冒頭でも説明されているように、クラス変数は同一クラスと派生クラスで共有される。ただし、クラス変数のアクセスレベルがcodice_1の場合、あるいはアクセスレベルがパッケージプライベート（デフォルト）で、派生クラスがパッケージ外にある場合は、派生クラスから参照することはできない。
class Hoge {
 static int foo; // クラス変数
 int bar; // インスタンス変数
このHogeクラスを実際に使用する例:
public class Main {
 public static void main(String[] args) {
 Hoge.foo = 100; // Hogeクラスのクラス変数に100を代入
 final Hoge hoge = new Hoge(); // インスタンスを生成
 hoge.bar = 20; // hogeインスタンスのインスタンス変数barに20を代入
 System.out.println("Hoge.foo = " + Hoge.foo); // fooを表示
 System.out.println("hoge.bar = " + hoge.bar); // barを表示
 // hogeインスタンスでクラス変数fooにアクセスすることもできる (ただし、推奨されない文法)。
 System.out.println("hoge.foo = " + hoge.foo);
 hoge.foo = 700; // クラス変数fooに700を代入
 hoge.bar = 800; // hogeインスタンスのインスタンス変数barに800を代入
 System.out.println("Hoge.foo = " + Hoge.foo);
 System.out.println("hoge.foo = " + hoge.foo);
 System.out.println("hoge.bar = " + hoge.bar);
 final Hoge another = new Hoge(); // インスタンスをもう一つ生成
 another.foo = 777; // クラス変数fooに777を代入
 another.bar = 888; // anotherインスタンスのインスタンス変数barに888を代入
 System.out.println("another.foo = " + another.foo);
 System.out.println("another.bar = " + another.bar);
 System.out.println("Hoge.foo = " + Hoge.foo);
 System.out.println("hoge.foo = " + hoge.foo);
 System.out.println("hoge.bar = " + hoge.bar);
実行結果
 Hoge.foo = 100
 Hoge.bar = 20
 hoge.foo = 100
 Hoge.foo = 700
 hoge.foo = 700
 hoge.bar = 800
 another.foo = 777
 another.bar = 888
 Hoge.foo = 777
 hoge.foo = 777
 hoge.bar = 800
この例ではインスタンス変数との違いを示すためにインスタンス変数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のままである。
用途.
クラス変数はクラスから生成される全てのインスタンスで共有可能な特徴を持つ変数である。この特徴を生かしたクラス変数の代表的な用途は以下の通り。