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 | |
+ ----------- + |
| (メソッド)|-使用---+
+ ----------- +