Понятие static
связано с тем, является ли что-то частью класса или объекта (экземпляра).
В случае метода main
, который объявлен как static
, он говорит, что метод main
является методом класса - методом, который является частью класса, а не частью объекта. Это означает, что другой класс может вызывать метод класса другого класса, ссылаясь на ClassName.method
. Например, вызов метода run для MyClass
будет выполняться следующим образом:
MyClass.main(new String[]{"parameter1", "parameter2"});
С другой стороны, метод или поле без модификатора static
означает, что он является частью объекта (или также называется «экземпляром»), а не частью класса. На него ссылается имя конкретного объекта, которому принадлежит метод или поле, а не имя класса:
MyClass c1 = new MyClass();
c1.getInfo() // "getInfo" is an instance method of the object "c1"
Поскольку каждый экземпляр может иметь разные значения, значения метода или поля с одинаковым именем в разных объектах не обязательно должны быть одинаковыми:
MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();
c1.value // The field "value" for "c1" contains 10.
c2.value // The field "value" for "c2" contains 12.
// Because "c1" and "c2" are different instances, and
// "value" is an instance field, they can contain different
// values.
Объединение двух понятий переменных экземпляра и класса. Допустим, мы объявляем новый класс, который содержит переменные и методы экземпляра и класса:
class AnotherClass {
private int instanceVariable;
private static int classVariable = 42;
public int getInstanceVariable() {
return instanceVariable;
}
public static int getClassVariable() {
return classVariable;
}
public AnotherClass(int i) {
instanceVariable = i;
}
}
Приведенный выше класс имеет переменную экземпляра instanceVariable
и переменную класса classVariable
, которая объявлена с модификатором static
. Аналогично, есть метод экземпляра и класса для получения значений.
Конструктор для экземпляра принимает значение для присвоения переменной экземпляра в качестве аргумента. Переменная класса инициализируется как 42
и никогда не изменяется.
Давайте на самом деле воспользуемся приведенным выше классом и посмотрим, что произойдет:
AnotherClass ac1 = new AnotherClass(10);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
Обратите внимание на различные способы вызова методов класса и экземпляра. То, как они ссылаются на класс по имени AnotherClass
или экземпляр по имени ac1
. Давайте пойдем дальше и посмотрим на поведенческие различия методов:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
AnotherClass.getClassVariable(); // Returns "42"
Как видно, переменная экземпляра - это переменная, которая содержится в объекте (или "экземпляре"), поэтому уникальна для этого конкретного экземпляра, который в этом примере является объектами, на которые ссылаются ac1
и ac2
.
С другой стороны, переменная класса уникальна только для всего этого класса. Чтобы еще лучше разобраться в этом, давайте добавим новый метод к AnotherClass
:
public int getClassVariableFromInstance() {
return classVariable;
}
Затем выполните следующее:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
ac1.getClassVariableFromInstance(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
ac2.getClassVariableFromInstance(); // Returns "42"
Хотя getClassVariableFromInstance
является методом экземпляра, что можно увидеть, вызвав ссылку на экземпляры ac1
и ac2
, они оба возвращают одно и то же значение 42
. Это связано с тем, что в обоих методах экземпляра они ссылаются на метод класса classVariable
, который является уникальным для класса, а не на экземпляр - для класса AnotherClass
имеется только одна копия classVariable
.
Я надеюсь, что кое-что проясняет, для чего используется модификатор static
.
Учебные руководства по Java от Sun содержат раздел Общие сведения об экземплярах и членах класса , в котором также рассматриваются два типа переменных и методов.