- PR -

staticについて

1
投稿者投稿内容
はぐ
会議室デビュー日: 2008/12/17
投稿数: 4
投稿日時: 2008-12-18 15:19
staticについて理解できないことがあるので、どなたかご教授お願いいたします。
下記の3つのサンプルクラスを作成しました。
(クラスの命名や、例外の握り潰しについては大目に見てやってください)

コード:
public class Account {
    public static int savings;
    public static int payBack(int sum) {
        System.out.println("預金残高:" + savings);
        System.out.println("払い戻し料:"+ sum);
        savings -= sum;
        return savings;
    }
}

public class AccountMain {
    // 実行メソッド。
    public static void main (String[] args) {
        int money = Integer.valueOf(args[0]);
        Account.savings = 10000;
        System.out.println("Aさん預金残高:" + Account.payBack(money));
        try {
            Thread.sleep(5000); // 5秒間停止
        } catch (InterruptedException e) {
            System.out.println("予期せぬエラーです。");
        }
        System.out.println("Aさん預金残高:" + Account.savings);
    }
}

public class AccountMain2 {
    // 実行メソッド。
    public static void main (String[] args) {
        int money = Integer.valueOf(args[0]);
        Account.savings = 25000;
        System.out.println("Bさん預金残高:" + Account.payBack(money));
        try {
            Thread.sleep(5000); // 5秒間停止
        } catch (InterruptedException e) {
            System.out.println("予期せぬエラーです。");
        }
        System.out.println("Bさん預金残高:" + Account.savings);
    }
}


コマンドプロンプトを2つ立ち上げ、各々でAccountMainとAccountMain2を実行します。
> java AccountMain 200
> java AccountMain2 100

予想では、AccountMainが実行してからAccountMain2によってAccountクラスのsavingsクラス変数が書き換えられるため、
AccountMainの実行結果が、----------
預金残高:10000
払い戻し料:200
Aさん預金残高:9800
Aさん預金残高:24900

AccountMain2の実行結果が、----------
預金残高:25000
払い戻し料:100
Bさん預金残高:24900
Bさん預金残高:24900
になると思ったのですが、実際の結果は異なり以下のようになりました。

[AccountMainの実行結果]----------
預金残高:10000
払い戻し料:200
Aさん預金残高:9800
Aさん預金残高:9800

[AccountMain2の実行結果]----------
預金残高:25000
払い戻し料:100
Bさん預金残高:24900
Bさん預金残高:24900


クラス変数の考え方、またはコーディングの仕方が間違えていますでしょうか?
未熟な質問で申し訳ありませんが、ご教授よろしくお願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2008-12-18 15:34
二つの jvm を立ち上げるとそれぞれ別々のプロセス、別々のメモリ空間で実行されます。

一方の vm の Account のフィールドを書き換えたからといって他の vm の static フィールドが書き換わるということはありません。
これはフィールドが static であるかどうかとは関係ありません。
はぐ
会議室デビュー日: 2008/12/17
投稿数: 4
投稿日時: 2008-12-19 14:04
>山本 裕介さん
なるほど!
2つのjvmが起動され、プロセスが異なれば値が変わることはまずないですね。
助かりました。どうもありがとうございました
1

スキルアップ/キャリアアップ(JOB@IT)