Особенности применения модификаторов в Java

Модификаторы доступа

Для начала разберемся с модификаторами доступа. Их всего четыре:
  • private члены класса доступны только внутри класса 
  • package-private или default (по умолчанию) члены класса видны внутри пакета
  • protected члены класса доступны внутри пакета и в классах-наследниках
  • public члены класса доступны всем

Во время наследования возможно изменение модификаторов доступа в сторону БОЛЬШЕЙ видимости.
Модификатор доступа у конструкторов, методов и полей может быть любой, а вот с классами и их блоками не так все просто. Класс может быть только либо public, либо default, причем в одном файле может находиться только один public класс. У блока может быть только один модификатор – default.

Модификаторы static, abstract и final

Static

  • Применяется к внутренним классам, методам, переменным и логическим блокам 
  • Статические переменные инициализируются во время загрузки класса 
  • Статические переменные едины для всех объектов класса (одинаковая ссылка) 
  • Статические методы имеют доступ только к статическим переменным 
  • К статическим методам и переменным можно обращаться через имя класса 
  • Статические блоки выполняются во время загрузки класса 
  • Не static методы не могут быть переопределены как static 
  • Локальные переменные не могут быть объявлены как static 
  • Абстрактные методы не могут быть static
  • Static поля не сериализуются (только при реализации интерфейса Serializable)
  • Только static переменные класса могут быть переданы в конструктор с параметрами, вызывающийся через слово super(//параметр//) или this(//параметр//)

Abstract

  • Применяется только для методов и классов 
  • У абстрактных методов нет тела метода 
  • Является противоположностью final: final класс не может наследоваться, abstract класс обязан наследоваться 
  • Класс должен быть объявлен как abstract если: 
  1. он содержит хотя бы один абстрактный метод 
  2. он не предоставляет реализацию наследуемых абстрактных методов 
  3. он не предоставляет реализацию методов интерфейса, реализацию которого он объявил 
  4. необходимо запретить создание экземпляров класса

Final

  • Поля не могут быть изменены, методы переопределены 
  • Классы нельзя наследовать 
  • Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным) 
  • Аргументы методов, обозначенные как final, предназначены только для чтения, при попытке изменения будет ошибка компиляции 
  • Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции 
  • Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект 
  • Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив 
  • Если класс объявлен final и abstract (взаимоисключающие понятия), произойдет ошибка компиляции 
  • Так как final класс не может наследоваться, его методы никогда не могут быть переопределены
Конструктор не может быть static, abstract или final

Модификаторы strictfp, transient, volatile, synchronized, native

Strictfp

  • Применяется для методов и классов 
  • Обеспечивает выполнение операций над числами типа float и double (с плавающей запятой) по стандарту IEEE 754

Transient

  • Применяется только для переменных уровня класса (локальные переменные не могут быть объявлены как transient) 
  • Transientпеременные могут не быть final или static. 
  • Transientпеременные не сериализуются

Volatile

  • Используется только с переменными 
  • Может использоваться со static переменными 
  • Не используется с final переменными - Значение переменной, объявленной как volatile, измененное одним потоком, асинхронно меняется и для других потоков 
  • Применяется в многопоточных приложениях

Synchronized

  • Применяется только к методам или частям методов 
  • Используется для контроля доступа к важным частями кода в многопоточных программах

Native

  • Используется только для методов 
  • Обозначает, что метод написан на другом языке программирования 
  • Классы в Java используют много native методов для повышения производительности и доступа к аппаратным средствам 
  • Можно предавать/возвращать Java объекты из native методов 
  • Сигнатура метода должна заканчиваться “;”, фигурные скобки вызовут ошибку компиляции

Особенности в интерфейсах

  • Методы всегда public и abstract, даже если это не объявлено
  • Методы не могут быть static, final, strictfp, native, private, protected 
  • Переменные только public static final, даже если это не объявлено 
  • Переменные не могут быть strictfp, native, private, protected 
  • Может только наследовать (extends) другой интерфейс, но не реализовывать интерфейс или класс (implements).
Соберем все модификаторы вместе:

Класс
Внутренний класс
Переменная
Метод
Конструктор
Логический блок
public
Да
Да (кроме локальных и анонимных классов)
Да
Да
Да
Нет
protected
Нет
Да (кроме локальных и анонимных классов)
Да
Да
Да
Нет
default
Да
Да 
Да (и для локальной переменной)
Да
Да
Да
private
Нет
Да (кроме локальных и анонимных классов)
Да
Да
Да
Нет
final
Да
Да (кроме анонимных классов)
Да (и для локальной переменной)
Да
Нет
Нет
abstract
Да
Да (кроме анонимных классов)
Нет
Да
Нет
Нет
static
Нет
Да (кроме локальных и анонимных классов)
Да
Да
Нет
Да
native
Нет
Нет
Нет
Да
Нет
Нет
transient
Нет
Нет
Да
Нет
Нет
Нет
synchronized
Нет
Нет
Нет
Да
Нет
Да (только как часть метода)
volatile
Нет
Нет
Да
Нет
Нет
Нет
strictfp
Да
Да
Нет
Да
Нет
Нет





Оригинал: http://www.quizful.net/post/features-of-the-application-of-modifiers-in-java

Комментариев нет:

Отправить комментарий