Модификатор static в Java: методы
Данная статья:
- написана командой Vertex Academy. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
В данной статье мы рассмотрим использование модификатора static для методов. Если же Вас интересует использование модификатора static для переменных, такую статью Вы можете найти по этой ссылочке.
Модификатора static - с англ. "статичный", "постоянный" - делает переменную или метод "независимыми" от объекта. Давайте рассмотрим, как модификатор применяется к методам.
Модификатор static для методов
1. Метод вызывается без создания объекта класса.
Как и в случае с полями, статические методы можно вызывать без создания объекта. Например, представим, что у нас есть класс MyClass - а внутри его два метода, статический и "обычный":
1 2 3 4 5 6 7 8 9 10 11 |
class MyClass{ public static void firstMethod (){ System.out.println("Это статический метод!"); } public void secondMethod (){ System.out.println("Это НЕ статический метод!"); } } |
Мы можем вызвать оба метода, создав объект класса MyClass:
1 2 3 4 5 6 7 8 9 10 |
class Test { public static void main (String args[]){ MyClass c1 = new MyClass(); c1.firstMethod(); c1.secondMethod(); } } |
Тем не менее, попробуем записать то же самое без создания объекта - вот так:
1 2 3 4 5 6 7 8 9 |
class Test { public static void main (String args[]){ MyClass.firstMethod(); MyClass.secondMethod(); } } |
Тут мы заменили название объекта - c1 - на название класса (ведь ни одного объекта теперь у нас нет! :)).
Как Вы думаете, что произойдет?
Естественно, такой код работать не будет. Дело в том, что так обращаться можно только к одному из этих методов - статическому:
1 2 3 4 5 6 7 8 |
class Test { public static void main (String args[]){ MyClass.firstMethod(); } } |
Если нам понадобится второй, не статический метод, понадобится создавать объект класса MyClass. Как видите, если обращаться к статическим методам и через название объекта, и название класса, код будет работать. К нестатическим методам нужно обращаться исключительно через название объектов класса.
2. Статические методы нельзя переопределять.
Как Вы помните, один из фундаментальных принципов ООП - это "наследование". Дело в том, что в случаях, когда нам нужно создать новый класс, который имеет много общих свойств с каким-то уже существующим, вместо того, чтобы писать все заново, можно сделать "наследника" существующего класса. Этот "наследник" будет иметь те же самые метод и переменные, что и "родитель".
Тем не менее, в классе-наследнике обычно можно переопределять существующие методы. Это значит, что можно создать метод с таким же названием, только заменить его "внутренности". Так вот, статический метод нельзя переопределить. По аналогии с переменными, можно сказать, что этот метод "один для класса и его наследников" - так же, как статическая переменная "одна для класса и всех его объектов".
3. Статическим методам нужен "статический контекст".
Есть такое правило: статический метод не может ссылаться на нестатическую переменную. Что это значит?
Представьте, что у нас в каком-то классе есть статический метод. То есть это метод, к которому, как Вы знаете, можно обращаться без создания объекта класса. Это значит, что если статический метод будет обращаться к нестатическим переменным (которые попросту "не будут существовать", потому что объект не объявлен), то возникнет ошибка. Поэтому, статические методы могут ссылаться только на статические переменные. Это гарантирует, что во время выполнения нашего метода все элементы будут инициализированы и будут работать. Именно это и называется "статическим контекстом".
Итог двух частей - зачем применяется модификатор static
Итак, Вы в общих чертах поняли, в чем заключается принцип работы модификатора static. Давайте подытожим - как он применяется?
1. Если нужно объявить любую константу - например, = 3,14 - обязательно нужно использовать static. Они объявляются с использованием сочетание "static final":
1 2 3 4 5 |
public class Test{ public static final double pi= 3.14159265359; } |
2. Если Вам нужно иметь доступ к переменной или методу без создания экземпляра класса. Например, представим, что у нас есть класс Cat. Логически, нет смысла делать статической переменную "имя кошки" - ведь оно будет индивидуальным для каждого экземпляра класс - т.е. для каждого кота. И метод "мяукать" делать статическим нет смысла - ведь без кошки (без создания объекта класса) вроде как некому будет мяукать 🙂
Но если представить, что у нас есть класс Math, в котором будет метод "найти корень квадратный". Это метод мы можем сделать статическим - ведь он нам явно очень пригодится, и будет часто использоваться. А зачем писать две строчки кода (создание экземпляра класса + вызов метода), если можно обойтись одной (вызов метода)? При этом, класс Math не несет никакой логическом нагрузки, в отличии от классов Cat, Dog или Car, и нам совершенно не нужен объект Math чтобы находить квадратные корни 🙂
3. У статических переменных и методов есть еще одно полезное свойство - они общие для всех экземпляров класса.
С одной стороны, это перекликается с установкой констант - пункт 1. Например, представьте, что у нас есть класс Cat, в котором есть два поля - "количество_лап" и "количество_хвостов". Понятно, что для всех экземпляров этого класса переменная "количество_лап" будет равна 4, а "количество_хвостов" равна 1. Мы можем сделать эти поля static, потому что они будут общими. Кроме того, это нам поможет сэкономить память, потому что эти переменные не будут "создаваться заново" для каждого экземпляра. Наоборот, все эти экземпляры будут ссылаться на одну и ту же - статическую - переменную.
Тот факт, что статическая переменная общая для всех классов, можно использовать и по-другому. Например, представьте, что у нас есть класс Dog. В этом классе, у нас будет статическая переменная "количество_собак", и мы сделаем так, чтобы каждый раз при создании объекта класса Dog она увеличивалась на 1. Таким образом, мы сможем посчитать, сколько мы создавали объектов! Или, как вариант, эту цифру можно использовать для присвоения уникального идентификационного номера каждой собаке.
Теперь Вы знаете основные способы применения модификатора static. Бывают и другие, но их мы рассмотрим позже.
Статья написана Vertex Academy. Будем рады видеть Вас на наших курсах Java с нуля.