Продолжая предыдущий пост, пора поговорить о второй группе модификаторов Java - модификаторах без доступа.

Эти модификаторы используются для описания определенного поведения переменной или метода.

Я остановлюсь только на наиболее распространенных модификаторах запрета доступа:

  1. static
  2. abstract
  3. 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 😅 есть еще несколько модификаторов, которые я не упомянул в этом посте. Но мне пришлось бы углубиться в многопоточность, чтобы это объяснить.

Надеюсь, этот пост окажется для вас полезным, не стесняйтесь оставлять комментарии или предложения. Покажите свою поддержку, хлопая в ладоши или подписываясь 😄

Следите за новостями… Приветствую всех 🍸