[#JAVACODE] Модификаторы доступа

| Просмотров 512

Модификаторов доступа в JAVA всего четыре. Их не трудно запомнить:

private – члены класса доступны только внутри класса
package-private или default (по умолчанию) – члены класса видны внутри пакета
protected – члены класса доступны внутри пакета и в классах-наследниках
public – члены класса доступны всем

Во время наследования возможно изменение модификаторов доступа в сторону БОЛЬШЕЙ видимости.

Модификатор доступа у конструкторов, методов и полей может быть любой, а вот с классами и их блоками не так все просто. Класс может быть только либо public, либо default, причем в одном файле может находиться только один public класс. У блока может быть только один модификатор – default.

8d3fefbab6d1

Модификаторы 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 класс не может наследоваться, его методы никогда не могут быть переопределены
* Конструктор не может быть 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

Да

Нет

Нет

Да

Нет

ТЕГИ   


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *