0

Javaでは、静的要素は、クラス名の後にdot演算子を指定するだけでアクセスされます。

静的プリミティブ型のClassAという名前のクラスがあると仮定しますint a = 10;

他の2つのクラスClassBClassCが同時に要素aにアクセスして変更を加えた場合、ClassBによって行われた変更はClassCにも影響しますか?

4

2 に答える 2

2

静的フィールドは、インスタンスではなくクラスに関連しています。静的フィールドを変更すると、そのフィールドへのすべての参照が最後に割り当てられた値を返します。ある意味で、Aはアプリケーション内のグローバル変数として定義されるようになりました。ほとんどのユースケースでは、これは良いこととは見なされません。

public class App {

    public static void main(String[] args) {
        B b = new B();
        C c = new C();

        System.out.println(A.a); //outputs 10
        b.changeA();
        System.out.println(A.a); //outputs 30
        c.changeA();
        System.out.println(A.a); //outputs 20
    }
}

class A{
    static int a = 10;
}

class B{
    public void changeA(){
        A.a = 30;
    }
}

class C{
    public void changeA(){
        A.a = 20;
    }
}
于 2012-12-22T09:20:44.483 に答える
2

他の2つのクラスがClassBありClassC、同時に要素にアクセスして変更を加えた場合、によって行われた変更はにClassB影響しClassCますか?

ClassA.a静的メンバーであるため、は1つだけです。ClassB影響による変更ClassA.aClassC同じメンバーを見ているので、変更が表示されます。

説明するシナリオは、コードと図でより適切に表現されます。

クラス:

class ClassA {
    static int a = 10;
}

class ClassB {
    static void look() {
        System.out.println("B sees " + ClassA.a);
    }
    static void change() {
        ClassA.a = 42;
    }
}

class ClassC {
    static void look() {
        System.out.println("C sees " + ClassA.a);
    }
    static void change() {
        ClassA.a = 67;
    }
}

それらの使用:

ClassB.look(); // "B sees 10"
ClassC.look(); // "C sees 10"
ClassB.change();
ClassB.look(); // "B sees 42"
ClassC.look(); // "C sees 42"
ClassC.change();
ClassB.look(); // "B sees 67"
ClassC.look(); // "C sees 67"

ダイアグラム:

                         + ---------- +
                         | ClassA |
                         + ---------- +
                  +-+ ---> | 静的a|
                  | | + ---------- +
+ ----------- + | |
| ClassB | | |
+ ----------- + | |
| (メソッド)| -use- + |
+ ----------- + |
                    |
+ ----------- + |
| ClassC | |
+ ----------- + |
| (メソッド)|-使用---+
+ ----------- +
于 2012-12-22T09:26:16.513 に答える