Модификаторы доступа
Для начала разберемся с модификаторами доступа. Их всего четыре:
- 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 если:
- он содержит хотя бы один абстрактный метод
- он не предоставляет реализацию наследуемых абстрактных методов
- он не предоставляет реализацию методов интерфейса, реализацию которого он объявил
- необходимо запретить создание экземпляров класса
Final
- Поля не могут быть изменены, методы переопределены
- Классы нельзя наследовать
- Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным)
- Аргументы методов, обозначенные как final, предназначены только для чтения, при попытке изменения будет ошибка компиляции
- Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции
- Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
- Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
- Если класс объявлен final и 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
Комментариев нет:
Отправить комментарий