static は全オブジェクトに共通

昨日は「オブジェクトは参照変数」という話をした。参照する先が違っていれば、実体である値が同じでもオブジェクトとしては異なる。しかし、static 修飾子が付いた場合は話は別である。次の例を見てほしい。

public class SavingsBox {
    private static int balance = 0;
    private String user;

    public SavingsBox(String user) {
        this.user = user;
        System.out.println(user + "が貯金箱を使います。");
    }

    public static void printBalance() {
        System.out.println("残高は" + balance + "円です。");
    }

    public void addBalance(int money) {
        balance += money;
        if(money < 0) {
            System.out.println(user + "は" + (- money) + "円使いました。");
        } else {
            System.out.println(user + "は" + money + "円貯金しました。");
        }
    }
}

(savings box = 貯金箱)

balance というメンバ変数に static が付いている。"static" は「静的」という意味だが、これはそのクラスのオブジェクトが初めて生成されるときに 1 回だけ初期化され、以降はそのクラスのオブジェクトがいくつ生成されても値は変動しない。なおかつ、このメンバ変数はそのクラスのオブジェクト全てで共通の値として使いまわされる。

class SavingsBoxTest {
    public static void main(String[] args) {
        SavingsBox user1 = new SavingsBox("兄");
        user1.addBalance(1000);
        SavingsBox.printBalance();

        SavingsBox user2 = new SavingsBox("弟");
        user2.addBalance(- 300);
        SavingsBox.printBalance();
        user2.addBalance(500);
        SavingsBox.printBalance();
        user1.addBalance(- 400);
        SavingsBox.printBalance();
    }
}

これを実行すると

兄が貯金箱を使います。
兄は1000円貯金しました。
残高は1000円です。
弟が貯金箱を使います。
弟は300円使いました。
残高は700円です。
弟は500円貯金しました。
残高は1200円です。
兄は400円使いました。
残高は800円です。

となって、balance の値を共有していることが確かめられる。