Статические свойства и методы

Пришло время познакомиться с еще одним понятием — статические свойства и методы. Статические методы/свойства классов это такие методы/свойства, к которым можно обратиться не создавая объект данного класса. Например, мы создаем описание стола. В этом случае, только когда мы создадим реальный стол, мы сможем говорить о его высоте и ширине (с учетом погрешностей при производстве). Но вот материал скорее всего будет один на всех. Также один на всех будет чертеж, название и прочие атрибуты. Т.е. очевидно, что некоторые свойства присущи не конкретному объекту, а классу целиком. Тоже самое можно сказать и о методах. К ним можно обращаться не создавая объект. Мы уже встречали такой метод — он называется main. Теперь мы можем более осознанно смотреть на такое определение:

При запуске JVM мы отдаем ей наш класс TestClass у которого есть статический метод main. В этом случае JVM не требуется создавать экземпляр класса для обращения к методу main.
Тоже самое касается и свойств класса. Если мы объявляем статическую переменную, это значит, что она одна на всех. Причем существует она даже тогда, когда нет ни одного экземпляра данного класса. Мы уже использовали статические свойства — например JFrame.EXIT_ON_CLOSE. Это статическое свойство, которое имеет определенную величину и к ней можно обратиться прямо через класс. Вы указываете имя класса, точку и имя переменной. Для вызова статического метода надо будет сделать нечто подобное. Важным отличием статического метода от обычного является то, что там не существует переменной this, т.е. обратиться к свойству класса, которое не является статическим, невозможно.

В указанном примере мы можем обратиться к свойству staticValue прямо в методе main. Но попытка обратиться к свойству simpleValue вызовет ошибку компиляции. Но обратиться к статическому свойству из обычного метода можно.

В общем-то на первый раз этой информации должно быть достаточно. Использование статических методов/свойств в некоторых случаях хорошо работает и использовать их удобно. Например метод преобразования строки в число или получение какой-либо константы. Мы еще будем встречаться с ними, тогда и будем расширять наши знания об их особенностях. На данных момент единственное, что еще хотелось бы упомянуть, это слово final.

Определение final

Определение final применяется в нескольких случаях. Во-первых, оно позволяет запретить изменение значения переменной. Т.е. если вы создадите переменную с определением final, то значение этой переменной уже нельзя будет поменять. Рассмотрим несложный пример.

Строка f = 200; не скомпилируется, т.к. переменная f уже проинициализирована.
Когда определение final применяется к свойству класса, то его можно инициализировать либо в месте описания, либо в конструкторе (только если инициализации не было в описании)

Применив определение final к статической переменной вы можете получить константу, что очень удобно. Уже упомянутое нами статическое свойство JFrame.EXIT_ON_CLOSE является константой и ее полное определение выглядит вот так:

Применяя определение final к методу вы запрещаете переопределять этот метод в классах-потомках. В приведенном примере наследники класса TestClass не смогут переопределить метод getFinalName().

Если же вы хотите совсем запретить расширения важного для вас класса, то при его определении вы можете использовать final. В приведенном примере уже невозможно будет создать наследника от класса TestClass

В Java достаточно много таких классов — Integer, String, Double.
Думаю, что на данный момент информации о слове final будет достаточно. К нему мы тоже еще будем возвращаться по мере изучения других возможностей Java.

И теперь нас ждет следующая статья: Отношения между классами.