Продолжая предыдущий пост, пора поговорить о второй группе модификаторов Java - модификаторах без доступа.
Эти модификаторы используются для описания определенного поведения переменной или метода.
Я остановлюсь только на наиболее распространенных модификаторах запрета доступа:
static
abstract
final
статический модификатор
Этот модификатор используется для создания переменной класса или метода, к которым можно получить доступ без экземпляра класса - объекта.
Это похоже на привязку переменной или метода к имени класса.
статическая переменная
Если у нас есть простой класс вроде:
Мы получаем доступ к creditCard
variable как: Person.creditCardNumber;
или стандартным способом, создавая объект:
Хотя у нас может быть много экземпляров класса Person
, у нас есть только одна переменная creditCardNumber
, которая используется всеми экземплярами.
Этот код:
В результате на консоль будет напечатано "13"
. Это потому, что оба объекта first
и second
используют одну и ту же переменную creditCardNumber
. Они оба могут получить к нему доступ и изменить.
Многие смешивают модификатор static
с Модификаторами доступа. Они думают, что эти двое как-то влияют друг на друга. Но на самом деле это не так.
static
всего лишь говорит о том, что нам не нужен экземпляр класса для доступа к переменной или методу. В нем ничего не говорится о том, откуда мы можем получить доступ к этим переменным и методам.
Ключевым моментом является использование переменной static
, когда мы хотим использовать одну и ту же переменную для всех экземпляров класса. Например, когда нам нужно использовать константы, к которым должны иметь доступ все экземпляры класса.
статический метод
Как и в случае с static
переменными, нам не нужен экземпляр класса для вызова static
методов.
Здесь можно вызвать метод shoutSomething
: Logger.shoutSomething();
static
методы могут обращаться только к своим параметрам и другим static
методам и static
переменным. static
метод не может получить доступ к переменным и методам класса, которые не объявлены static
.
Было бы неплохо объявить метод static
, если он не управляет классом, в котором он находится. Или если метод работает только со своими параметрами.
Хорошими примерами классов с static
методами являются классы util и helper. Как Math
или LocalDateTime
.
статический блок
Это блок кода, используемый для инициализации static
переменных класса.
Здесь мы видим, что мы инициализировали переменную something
равной "smthing!!”
из блока static
.
Блок static
действительно полезен, когда нам нужно несколько шагов для инициализации переменной static
. Например, если мы хотим, чтобы наш атрибут static
был List
из нескольких элементов внутри. Сделать это можно из блокаstatic
:
абстрактный модификатор
Модификатор abstract можно использовать с методом или классом.
абстрактный метод
Когда мы объявляем метод как abstract
, мы не предоставляем его реализацию в классе, в котором он находится.
Например:
Здесь у нас есть метод doWork()
, который объявлен как abstract
.
Реализации метода doWork()
не предусмотрено.
абстрактный класс
Класс, содержащий abstract
метод, должен быть объявлен как abstract
класс.
В этом примере мы видим, что Airplane
класс был объявлен abstract
.
Помимо abstract
методов, классabstract
может содержать неабстрактные переменные и методы, как и любой другой класс.
Невозможно создать экземпляр класса abstract
.
Так что это довольно странное сочетание. Напомним, что класс abstract
имеет переменные и методы, как и любой другой класс. Но, кроме того, в нем есть объявления методов (abstract
методов). И это не может быть создано. Так чем же это может быть полезно?
Уловка заключается в том, что когда класс расширяет класс abstract
, он должен предоставлять реализацию для всех abstract
методов родительского класса.
Мы заставляем все подклассы класса abstract
содержать определенный метод с определенным именем, типом возвращаемого значения и параметрами. Но оставьте определение того, что делают эти методы, подклассам:
Обратите внимание, что для обоих самолетов Bomber
и Transporter
атрибут name
установлен на "Ilyushin"
. У них обоих есть doWork()
метод, но с разными реализациями.
Такое поведение является основой полиморфизма, шаблонов проектирования…
последний модификатор
Модификатор final
можно использовать с классами, методами или переменными.
последний класс
Когда мы объявляем класс как final
, мы не можем расширять его другими классами.
Таким образом, этот код будет недействительным:
окончательный метод
Когда мы объявляем метод как final
, мы не можем переопределить его из подкласса.
Попытка переопределить метод doTheDishes()
из подкласса приведет к ошибке:
последняя переменная
final
переменные могут быть объявлены и инициализированы одновременно:
Или они могут быть объявлены пустыми и инициализированы в статическом блоке:
После инициализации их значение нельзя изменить. Попытка изменить значение переменной TRUTH
приводит к ошибке.
Если переменная final
является ссылкой на объект:
его нельзя переназначить, этот код приведет к ошибке:
но объект, на который он указывает, можно изменить, код ниже действителен:
Вывод
На этом я завершаю свою серию из двух частей о модификаторах Java 😅 есть еще несколько модификаторов, которые я не упомянул в этом посте. Но мне пришлось бы углубиться в многопоточность, чтобы это объяснить.
Надеюсь, этот пост окажется для вас полезным, не стесняйтесь оставлять комментарии или предложения. Покажите свою поддержку, хлопая в ладоши или подписываясь 😄
Следите за новостями… Приветствую всех 🍸