Как отмечается в комментариях, вы можете захотеть взглянуть на учебник , чтобы понять принципиальную разницу между статической и нестатической переменными.
Сжатые эффекты ...
1: ... статические переменные могут быть доступны без создания экземпляра этого класса, а нестатические переменные - нет. Это связано с тем, что для нестатических переменных требуется установить экземпляр этого класса, поскольку они могут отличаться от экземпляра к экземпляру, а статические переменные, такие как File.separatorChar
, зависят от класса.
2: ... Нестатические переменные недоступны из статических методов. Это означает, что это работает:
static int countInstances = 0;
int myID;
public TestClass() {
countInstances++;
myID = countInstances;
}
public static void main(String[] args) {
System.out.println(countInstances);
}
Пока это не скомпилируется:
public static void main(String[] args) {
System.out.println(myID); // Won't compile
}
Это связано с тем, что статический метод может обращаться только к статическим переменным, поэтому он не связан ни с одним конкретным экземпляром. Поэтому он не может ссылаться на переменные, которые устанавливаются только в экземплярах (которые все являются нестатическими переменными).
3: ... содержимое статической переменной будет одинаковым для нескольких экземпляров.
Пример:
static int countInstances = 0;
public TestClass() {
countInstances++;
System.out.println(countInstances);
}
public static void main(String[] args) {
new TestClass();
new TestClass();
}
Это будет иметь выходные данные 1
и 2
. Оба раза счетчик увеличивается, и поскольку переменная относится не к одному из экземпляров, а к самому классу, ее содержимое обновляется для каждого экземпляра при обращении к нему.