Javaでは、静的要素は、クラス名の後にdot
演算子を指定するだけでアクセスされます。
静的プリミティブ型のClassAという名前のクラスがあると仮定しますint a = 10;
他の2つのクラスClassBとClassCが同時に要素a
にアクセスして変更を加えた場合、ClassBによって行われた変更はClassCにも影響しますか?
Javaでは、静的要素は、クラス名の後にdot
演算子を指定するだけでアクセスされます。
静的プリミティブ型のClassAという名前のクラスがあると仮定しますint a = 10;
他の2つのクラスClassBとClassCが同時に要素a
にアクセスして変更を加えた場合、ClassBによって行われた変更はClassCにも影響しますか?
静的フィールドは、インスタンスではなくクラスに関連しています。静的フィールドを変更すると、そのフィールドへのすべての参照が最後に割り当てられた値を返します。ある意味で、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;
}
}
他の2つのクラスが
ClassB
ありClassC
、同時に要素にアクセスして変更を加えた場合、によって行われた変更はにClassB
影響しClassC
ますか?
ClassA.a
静的メンバーであるため、は1つだけです。ClassB
影響による変更ClassA.a
。ClassC
同じメンバーを見ているので、変更が表示されます。
説明するシナリオは、コードと図でより適切に表現されます。
クラス:
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 | | + ----------- + | | (メソッド)|-使用---+ + ----------- +