KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

Javaのインスタンス変数とクラス変数について学ぶ

「Javaプログラミング技法」の第6回目の授業内容まとめになります。

※前回授業の内容はこちら

www.kato-eng.info

インスタンス変数とインスタンスメソッド

インスタンス変数とはインスタンスに関連付けられたフィールド変数のことで、「new」で生成された個々のインスタンスが持つ変数である。

// Student.java
class Student {
    // インスタンス変数「id」の宣言
    public int id;

    // インスタンスメソッド「getID」の宣言
    public int getID() {
        return this.id;
    }
}
// StudentManager.java
class StudentManager {
    public static void main(String[] args) {
        // Student型のインスタンスを「student1」変数で生成
        Student student1 = new Student();
        student1.id = 10; // student1のインスタンス変数「id」に10を代入

        // Student型のインスタンスを「student2」変数で生成
        Student student2 = new Student();
        student2.id = 20; // student2のインスタンス変数「id」に20を代入

        // Studentクラスのインスタンスメソッド「getID」の呼び出し
        System.out.println(student1.getID());
        System.out.println(student2.getID());
    }
}

上記プログラムの出力は下記の通り。

10
20
  • インスタンス変数はインスタンス毎に独立している
  • インスタンスメソッドはそのメソッドを持つインスタンスに対して作用する
  • インスタンスが生成されていなければインスタンス変数もインスタンスメソッドも存在しない

クラス変数

クラス変数とは個々のインスタンスではなく、クラスに関連付けられたフィールド変数のことである。クラス変数は同じクラスから生成されたインスタンス毎に独立しておらず、そのクラスから生成されたインスタンス全体で共有の変数である。

// Student.java
public class Student{
    public int id;
    public static int classNo; // クラス変数には「static」を付ける

    public void setStatus(int id, int classNo) {
        this.id = id;
        this.classNo = classNo;
    }
    
    public int getID() {
        return this.id;
    }

    public int getClassNo() {
        return classNo;
    }
}
// StudentManager.java
public class StudentManager {
    public static void main(String[] args) {
        Student student1 = new Student();
        student1.setStatus(10, 1);

        Student student2 = new Student();
        student2.setStatus(20, 2);

        System.out.println("student1のid:" + student1.getID());
        System.out.println("student1のclassNo:" + student1.getClassNo());
        System.out.println("student2のid:" + student2.getID());
        System.out.println("student2のclassNo:" + student2.getClassNo());
    }
}

上記プログラムの出力結果は下記の通り。

student1のid:10
student1のclassNo:2
student1のid:20
student1のclassNo:2

インスタンス変数である「id」はstudent1とstudent2で独立しているが、「classNo」はクラス変数のためstudent2のsetStatusメソッドで上書きされてしまっている。

また、クラス変数はインスタンスが無くても参照することができる。

// Student.java
class Student() {
    public static int staID = 0;
    public int insID;
}
// StudentManager.java
class StudentManager() {
    public static void main(String[] args) {
        Student student; インスタンスの生成は行わないでStudent型のstudent変数を作成

        //System.out.println(student.staID); # student変数の先にインスタンスが無いのでエラーになる
        //System.out.println(student.insID); # Studentクラス本体にinsIDの領域が無いのでエラーになる
        System.out.println(Student.staID); // studentクラスが持っているクラス変数の「staID」を出力する
    }
}

出力結果は下記の通り。

0
  • クラス変数は複数のインスタンスで共有できる
  • クラス変数はインスタンスが無くても参照できる

※次回授業の内容はこちら

www.kato-eng.info