HOME> Javaアプリケーション講座>クラスの基礎>インスタンス変数とstatic変数

インスタンス変数とstatic変数

変数にはインスタンス変数、static変数があります。
その2つの変数はまったく管理のしかたが異なる変数です。
順番に見ていきます。

インスタンス変数

インスタンス変数とは基本的に今まで使ってきたメンバー変数のことで、
生成されたオブジェクト、つまりインスタンスされたオブジェクトごとに用意された変数です。

サンプルプログラムを見てください。

サンプルプログラム(Sample42.java)

class Sample42{
    public static void main(String args[]){       
      Sub42 obj1 = new Sub42();
      Sub42 obj2 = new Sub42();
      Sub42 obj3 = new Sub42();

     System.out.println("obj1.x = " + obj1.x);
     System.out.println("obj2.x = " + obj2.x);
     System.out.println("obj3.x = " + obj3.x);
    }

}

class Sub42{

 int x = 10;
}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます

実に簡単なサンプルですね!

Sub42.classではint 型の変数 xだけ定義しています。
それを、Sample42でインスタンス化して参照変数でobj1,obj2,obj3でxを呼び出しています。
ここで、最初に説明したように各オブジェクトごとに用意された変数になります。

つまり
obj1.x = 10;
obj2.x = 10;
obj3.x = 10;

つまり、各参照変数obj1にもxの値が用意され、obj2にもxの値が用意され、
obj3にもxの値が用意されていることになります。
したがって各オブジェクトが参照しているxの値は異なるわけです。

static変数

インスタンス変数がオブジェクトごとに用意された変数に対して
static変数とはクラス対応に1つだけ存在する変数です。
オブジェクトごとに存在するインスタンス変数とは異なりオブジェクトを生成
しなくてもアクセスは可能です。

static変数はクラス単位で管理したいときに便利な変数です。

static変数の定義方法


   (キーワード )static 基本データ型 変数名;

    アクセス方法は

  クラス名.変数名;

サンプルプログラム(Sample42_1.java)

class Sample42_1{
    public static void main(String args[]){
    System.out.println(" Sub42_1.x = " + Sub42_1.x);
    System.out.println(" Sub42_1.x = "  + Sub42_1.x);
    System.out.println(" Sub42_1.x = "  + Sub42_1.x);
    }

}
class Sub42_1{
  static int x = 10;

}
           

プログラムをコピーする場合すべて選択をクリックしてください。

コンパイル・実行したいと思います。

このようになります。
static変数はインスタンス変数と異なりクラス単位で管理されていることは最初説明しましたが、
このSample42.javaとSample42_1.javaを比較しただけでは少しわかりにくいと思います。
少し上記サンプルを書き換えてインスタンス変数とstatic変数の違いを見たいと思います。

サンプルプログラム(Sample42_2.java )

class Sample42_2{
    public static void main(String args[]){

      Sub42_2 obj1 = new Sub42_2();
      Sub42_2 obj2 = new Sub42_2();
      Sub42_2 obj3 = new Sub42_2();

     System.out.println(" obj1.x = " + obj1.x++);
     System.out.println(" obj2.x = " + obj2.x++);
     System.out.println(" obj3.x = " + obj3.x++);
     System.out.println("------------------------");
     System.out.println(" obj1.x = " + obj1.x);
     System.out.println(" obj1.x = " + obj2.x);
     System.out.println(" obj1.x = " + obj3.x);
    }

}
class Sub42_2{
 int x = 10;
}

プログラムをコピーする場合すべて選択をクリックしてください。

サンプルプログラム(Sample42_3.java)

class Sample42_3{
    public static void main(String args[]){
   System.out.println(" Sub42_3.x = " + Sub42_3.x++);
   System.out.println(" Sub42_3.x = " + Sub42_3.x++);
   System.out.println(" Sub42_3.x = " + Sub42_3.x++);
   System.out.println("---------------------------");
   System.out.println(" Sub42_3.x = " + Sub42_3.x);
    }

}

class Sub42_3{
  static int x = 10;
    }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行したいと思います。

実行結果からxの値の違いを考えてみてください。
インスタンス変数とstatic変数の違いがよくわかると思います。
共にxをインクリメントしているのですが、インスタンス変数は各オブジェクトで
参照している変数が異なるので各xの値に対してインクリメントしています。
すなわちobj1.x も obj2.x も obj3.x も 値は11になるのに対して

static変数はクラス単位の変数です。最初x をインクリメントしました。
それを引き継ぎ2回目の呼び出しの時はさらにそれにインクリメントするので
値がどんどん増えていくのです。
これが、インスタンス変数とstatic変数の大きな違いです。

ページのトップへ戻る