2

静的変数は、オブジェクトごとではなく、クラスがロードされたときに1回だけ作成および初期化されることを知っていました。

以下に示すコードでは、次のようにしています。クラスAでint変数 "a"を静的として宣言し、値5を割り当てました。mainが実行されると、値を6に変更し、プログラムを次のようにします。無限にループします。したがって、現在「a」の値は6です。

今私がやろうとしたのは、クラスAがまだループしているときに、他のクラスクラスBからこの変数にアクセスしようとしたことです。クラスBを実行すると、6が出力されるはずです(クラスB「a」の値を実行するまでに6)に変更されましたが、驚くべきことに、それでも5が得られました。

「a」を静的と宣言したのに、なぜこれが発生するのですか?このアプローチの何が問題になっているのか理解できません。

class A{
    static int a=5;

    public static void main(String args[]){
        System.out.println(A.a+"");
        a=6;
        while(true){
        }
    }
}

class B{    
    public static void main(String args[]){
        System.out.println(A.a+"");
    }
}
4

4 に答える 4

4

あなたが抱えている問題は、2つの異なるJVMプロセスを実行していることです。あなたがすべきことは、それぞれの「メイン」メソッドを独自のスレッドで実行することです。このようにして、同じメモリを共有します(したがって、変更できます)。スレッドを使用するように変更された例を次に示します。

public class Main{
    public static int v = 5;

    public static void main(String[] args) throws Exception{
        new Thread(new A()).start();
        Thread.sleep(5000);
        new Thread(new B()).start();
    }
}

class A implements Runnable{
    public void run(){
        System.out.println(Main.v);
        Main.v = 6;
    }
}

class B implements Runnable{
    public void run(){
        System.out.println(Main.v);
    }
}

補足:この例は質問から何が期待されるかを示していますが、複数のスレッドを使用する正しいJavaプログラムを作成することに関してはまだ多くの間違いがあります。あなたの研究をしてください。

于 2012-05-21T17:50:41.493 に答える
1

2つのJavaプロセスと2つのプログラムを実行しています。class A2番目のクラスローダーは静的変数をロードして5に設定しますが、6にインクリメントするでclass B定義された静的main()メソッドを呼び出すための呼び出しはありません。class A

于 2012-05-21T17:44:25.353 に答える
0

Aでメインループを実際に実行することはありません。

値を変更するメソッドを作成するだけです。

于 2012-05-21T17:41:04.243 に答える
0

これは、Aのmainメソッドが呼び出されないためです。

于 2012-05-21T17:42:21.763 に答える