Статические элементы 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;
}
}