Как правило, static
означает "связанный с типом , а не экземпляром типа."
Это означает, что вы можете ссылаться на статическую переменную, даже не создавая экземпляры типа, и любой код, ссылающийся на переменную, ссылается на те же самые данные. Сравните это с переменной экземпляра: в этом случае для каждого экземпляра класса существует одна независимая версия переменной. Так, например:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
выводит 10: y.instanceVariable
и x.instanceVariable
являются отдельными, потому что x
и y
относятся к разным объектам.
Вы можете обращаться к статическим элементам через ссылки, хотя это плохая идея. Если бы мы сделали:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
тогда это вывело бы 20 - есть только одна переменная, а не одна на экземпляр. Было бы яснее написать это так:
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
Это делает поведение намного более очевидным. Современные IDE обычно предлагают изменить второй листинг на третий.
Нет никаких причин иметь такую декларацию, как
private final int NUMBER = 10;
Если это не может измениться, нет смысла иметь одну копию на экземпляр.