Статические методы. Плюсы и минусы.
Автор: Андрей Самойлов
Определение
Статическими методами в Java называют такие методы, которые могут быть вызваны без создания экземпляра класса. Например, метод pow () из класса Math является статическим:
//Math.pow returns double, need cast, display 256 int result = (int) Math.pow(2, 8);
При вызове метода Math.pow (х , а) вычисляется степень x числа а. При выполнении этого метода не используется ни один из экземпляров класса Math. Иными словами, у него нет неявного параметра this. Это означает, что в статических методах не используется текущий объект по ссылке this. (А в нестатических методах неявный параметр this ссылается на текущий объект)
Когда следует использоватьЕсли поведение метода не зависит от состояния объекта(значений полей класса), метод следует объявить как статический. Статические методы следует применять в двух случаях:
NumberFormat currencyFormatter = NumberFormat.getCurrencylnstance(); NumberFormat percentFormatter = NumberFormat.getPercentlnstance(); double x = 0.1; System.out.println(currencyFormatter.format(x)); // выводит $0.10 System.out.println(percentFormatter.format(x)); // выводит 10%
Почему же не использовать для этой цели конструктор? На то есть две причины.
Важным моментом является то, что статические методы переопределять (Override) нельзя. Если объявить такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, то лишь «спрячется» метод суперкласса (superclass) вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен как в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:
class Vehicle{ public static void kmToMiles(int km) { System.out.println("Внутри родительского класса/статического метода"); } } class Car extends Vehicle{ public static void kmToMiles(int km) { System.out.println("Внутри дочернего класса/статического метода "); } } public class Demo{ public static void main(String args[]) { Vehicle v = new Car(); v.kmToMiles(10); } }
Вывод в консоль:
Внутри родительского класса/статического метода
Код наглядно демонстрирует: несмотря на то, что объект имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И при этом ошибки во время компиляции не возникло!
Статические методы в JVMСтатические методы и переменные хранились в области Permgen до 8-й версии java. Начиная с 8-й версии, они хранятся в новой область памяти, которая называется Metaspace
Примеры применения статических методов
boolean oldFlag = MyUtils.getFlag(); MyUtils.someMethod(); MyUtils.setFlag( oldFlag );
Необходимо с осторожностью подходить к принятию решения о применении статических методов в дизайне приложения. Их следует применять только в случаях если: