Свойство stati c связано с определением класса, и существует только одно определение класса. Экземпляр создается всякий раз, когда вы используете ключевое слово new
в классе. Все экземпляры хранят свои личные данные из класса stati c. При использовании экземпляра класса вы можете получить доступ к переменным stati c, но не наоборот.
Вы используете термин константа, но я думаю, что у вас может быть некоторое недопонимание того, что это означает. Константы часто объявляются как static
final
значения, которые являются неизменными (они никогда не могут быть изменены). Вы не должны иметь возможность изменять константу. Значение stati c может быть изменяемым, если вы этого хотите, и это то, что мы иногда называем синглтоном с состоянием.
Рассмотрим эти два примера ... один изменяет переменную экземпляра, другой - переменную stati c.
class InstanceFoo {
int i = 1000;
int resetCounter() {
i = 1000;
return i;
}
int getAndIncrement() {
return i++;
}
}
class StaticFoo {
static int i = 1000;
static int resetCounter() {
i = 1000;
return i;
}
static int getAndIncrement() {
return i++;
}
}
В первом примере вам нужно использовать экземпляр для доступа к переменные .. т.е. вам нужно создать его экземпляр с помощью new
:
InstanceFoo foo = new InstanceFoo();
System.out.println(foo.resetCounter()); // 1000
System.out.println(foo.getAndIncrement()); // 1000
System.out.println(foo.getAndIncrement()); // 1001
System.out.println(foo.getAndIncrement()); // 1002
System.out.println(foo.resetCounter()); // 1000
Во втором вы получите доступ к значению stati c. На статику можно ссылаться с помощью определения класса:
System.out.println(StaticFoo.resetCounter()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1001
System.out.println(StaticFoo.getAndIncrement()); // 1002
System.out.println(StaticFoo.resetCounter()); // 1000
В вашем примере вы пытаетесь увеличить счетчик, выполнив resetCounter()++
. Это не будет работать по отдельной причине полностью из-за stati c или экземпляра. Примитивные значения в Java (такие как целые, двойные числа, числа с плавающей запятой и т. Д. c) передаются по значению, а не по ссылке.
В очень простом смысле c это означает, что после возврата Примитив из метода, подобного resetCounter
, вы фактически передаете копию значения. Затем вы увеличиваете копию, но значение, связанное с классом, остается тем же (поскольку вы увеличиваете только копию переменной). Вам нужно вызывать постфиксный оператор ++
для самой переменной, а не для значения, возвращаемого методом. т.е. если у меня есть
class StaticFoo {
static int i = 1000;
static int get() {
return i;
}
}
System.out.println(StaticFoo.get()++); // prints 1000 and adds 1. the copy is then destroyed
System.out.println(StaticFoo.get()++); // prints 1000 and adds 1, the copy is then destroyed
System.out.println(StaticFoo.i); // prints 1000
System.out.println(StaticFoo.i++); // prints 1000 and now a postfix is applied to the static variable
System.out.println(StaticFoo.i++); // prints 1001 and another postfix is applied to the static variable
System.out.println(StaticFoo.get()); // prints 1002 because two postifx operators were applied to StaticFoo.i.
Надеюсь, это поможет вам начать.