インスタンス変数 (instance variable) とは、Smalltalk等のオブジェクト指向言語において、オブジェクトインスタンスごとに割り当てられた変数のことである。フィールド (field)、データメンバ (data member)、メンバ変数 (member variable) とも呼ばれる。それに対してクラス変数は、同じクラスに対する全てのインスタンスが同じ値を共有する。

インスタンス変数は、インスタンスフィールド (instance field) あるいは、略して「フィールド」と呼ぶこともある (本来、この「フィールド」の意味には、「クラス変数」も含まれるが、プログラミング言語によってはインスタンス変数のことを「フィールド」と呼び、クラス変数とは名前を区別しているもの[要説明]もある)。UMLではインスタンス変数のことを属性 (attribute) とも呼ぶ。

Javaのクラスを用いた例を示す。

class Foo {
  String bar;
  static String baz;
}

上記の例において、barはクラスFooのインスタンス変数である。それに対して、bazはクラス変数である。 以下のプログラムで、Fooクラスを用いてクラス変数インスタンス変数の違いを示す。

プログラム例:

class TestFoo {
  public static void main(String [] args) {
    Foo foo1 = new Foo();
    Foo foo2 = new Foo();
    foo1.bar = "foo1.bar"; // foo1.bar (インスタンス変数) に"foo1.bar"を代入
    foo1.baz = "foo1.baz"; // foo1.baz (クラス変数) に"foo1.baz"を代入
    foo2.bar = "foo2.bar"; // foo2.bar (インスタンス変数) に"foo2.bar"を代入
    foo2.baz = "foo2.baz"; // foo2.baz (クラス変数) に"foo2.baz"を代入
    System.out.println("foo1.bar=" + foo1.bar + " foo1.baz=" + foo1.baz);
    System.out.println("foo2.bar=" + foo2.bar + " foo2.baz=" + foo2.baz);
  }
}

実行結果:

foo1.bar=foo1.bar foo1.baz=foo2.baz
foo2.bar=foo2.bar foo2.baz=foo2.baz

上記のプログラムにおいて、foo1.bazとfoo2.bazはFooクラスのクラス変数を表している。 つまり、foo1.bazとfoo2.bazが表しているインスタンスは同一である。 そのため、結果として出力されるfoo1.bazとfoo2.bazの値は同じとなる。 逆に、foo1.barとfoo2.barはインスタンス変数であり、独立した変数である。 そのため、結果として出力されるfoo1.barとfoo2.barは異なった値となる。

関連項目 編集