Статические элементы Java Доступ к другому классу

В Java доступ к статическим элементам осуществляется путем указания только имени класса, за которым следует dot оператор.

Предположим, у меня есть класс с именем ClassA со статическим типом примитива int a = 10;

Что делать, если у меня есть два других класса ClassB и ClassC доступ к элементу a в то же время и внести некоторые изменения, изменения, внесенные ClassB, также повлияют на ClassC?

2 ответа

Решение

Что делать, если у меня есть два других класса ClassB а также ClassC получить доступ к элементу a и внести некоторые изменения, ClassB также влияет на ClassC?

Здесь только один ClassA.a потому что это статический член. Изменения, сделанные 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 |
                         + ---------- +
                  + - + ---> | статический |
                  | |    +----------+
+-----------+     | |
|  ClassB   |     | |
+-----------+     | |
| (методы) |-use-+ |
+-----------+       |
                    |
+-----------+       |
|  ClassC   |       |
+-----------+       |
| (методы) |-use---+
+-----------+ 

Статические поля относятся к классу, а не к экземпляру. Модификация статического поля приведет к тому, что все ссылки на это поле вернут последнее назначенное значение. В некотором смысле 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;
    }
}
Другие вопросы по тегам