Статическими можно объявлять не только переменные, но и методы. Наиболее общим примером static-элемента является метод main(). Он объявляется как static, потому что должен вызваться прежде, чем будут созданы какие-либо объекты.
Скачать исходники для статьи можно ниже
Методы, объявленные как static имеют несколько ограничений:
– могут вызывать только другие static-методы;
– должны обращаться только к static-данным;
– никогда не могут ссылаться на this или super. (Ключевое слово super касается наследования).
Следующий пример демонстрирует класс, который имеет статические методы, несколько переменных и блок инициализации:
// Демонстрирует статические переменные, методы и блоки.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("meth");
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("static");
System.out.println("Статический блок инициализирован.");
b = a * 4;
}
public static void main(String[] args) {
System.out.println("main");
meth(42);
}
}
Всe static-инструкции выполняются сразу же после загрузки класса UseStatic. Сначала, в а устанавливается 3, затем выполняется static-блок (печатая сообщения), и наконец, b инициализируется значением а * 4 или 12. Затем вызывается метод main(), который обращается к meth(), передавая 42 параметру х. Три оператора println о обращаются к двум static-переменным (а и b) и к локальной переменной x.
Вывод этой программы:
static Статический блок инициализирован. main meth x = 42 a = 3 b = 12
Вне класса, в котором они определены, статические методы, как и переменные могут использоваться независимо от любого объекта. В этом случае для обращения к ним используются имена их класса и точечная операция. Например, если нужно вызвать static-метод вне его класса, можно воспользоваться следующей общей формой вызова:
classname.methodname()
Здесь
classname — имя класса, в котором объявлен static-метод;
methodname — имя статического метода.
Нетрудно заметить, что этот формат подобен вызову нестатических методов через переменные, ссылающиеся на объект. Так Java реализует управляемую версию глобальных функций.
Например:
class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a = " + a);
}
}
public class StaticByName {
public static void main(String[] args) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
}
}
Здесь внутри метода main() к статическому методу callme() и статической переменной b обращаются вне их класса.
Вывод этой программы:
a = 42
b = 99
Спецификатор final
Применение final в методах связаны с наследованием (для отказа от переопределения и для отмены наследования).


