Это метод экземпляра !!! Для класса method
или attribute
необходимо явное использование модификатора static
. Вы создаете экземпляр Animal и вызываете метод dump()
в этом экземпляре. См. Мой пример:
public class Animal {
static int x = 0; // is an attribute of class
int y = 0; // is an instance attribute
static void myStaticMethod() { // is an method of class
x++; // increment the class attribute
// y++; wrong, compilation error !!! y is an instance attribute
}
void myMethod() { // is an instance method
y++; // increment the instance attribute
x++; // increment the class attribute
}
}
Еще одна особенность: статические c атрибуты / методы назначаются памяти во время компиляции, а нестатистические c атрибуты / методы назначаются памяти при выполнении время. Жизненный цикл атрибута / метода stati c начинается при выполнении программы и заканчивается в конце выполнения, атрибут / метод экземпляра длится (в Java), в то время как счетчик ссылок для этого экземпляра, если выше, то 0, по счетчику ссылок 0 сборщик мусора освобождает выделенную память для этого экземпляра. Посмотрите:
Animal cat = new Animal();
Animal.myStaticMethod();
cat.myMethod();
Animal dog = new Animal();
Animal.myStaticMethod();
dog.myMethod();
dog.myMethod();
System.out.println("Animal::x = " + Animal.x);
System.out.println("cat::y = " + cat.y);
System.out.println("dog::y = " + dog.y);
Вывод (без y ++ в myStaticMethod):
Animal::x = 5
cat::y = 1
dog::y = 2