0

在 Java 中,静态元素是通过仅指定类名后跟dot运算符来访问的。

假设,我有一个名为ClassA的类,它具有静态原始类型int a = 10;

如果我有其他两个类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

如果我有其他两个类ClassB并同时ClassC访问元素 a 并进行一些更改,那么所做的更改是否ClassB也会影响ClassC

只有一个ClassA.a,因为它是静态成员。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"

图表:

                         +----------+
                         | 甲级 |
                         +----------+
                  +-+--->| 静态a |
                  | | +----------+
+-----------+ | |
| B类 | | |
+-----------+ | |
| (方法)|-使用-+ |
+-----------+ |
                    |
+-----------+ |
| C类 | |
+-----------+ |
| (方法)|-使用---+
+-----------+
于 2012-12-22T09:26:16.513 回答