Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Топ контрибуторов
loading
loading
Знаете ли Вы, что

После прохождения теста можно комментировать вопросы теста, а Ваши комментарии увидят модераторы теста и пользователи, которым когда-либо эти вопросы попадались.

Лента обновлений
ссылка 14:04:08
Комментарий от coven:
а почему разные маски? разве у второго ПК не долдна быть т...
ссылка 12:42:02
Комментарий от zyurii:
Вибачаюсь за свого співвітчизника. І погоджуюсь з Вашим т...
ссылка Jul 21 23:10
Комментарий от KlimAndr:
если бы речь шла об одной акции и 99 споров и вопросов ...
ссылка Jul 21 22:36
Комментарий от KlimAndr:
? по первым двум буквам , видно,что три младшие линии ...
ссылка Jul 21 21:46
Комментарий от KlimAndr:
мне понравилось.+
Статистика

Тестов: 153, вопросов: 8599. Пройдено: 411051 / 2001597.

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

head tail Статья
категория
Java
дата09.09.2013
авторgurn
голосов64

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

Для начала разберемся с модификаторами доступа. Их всего четыре:

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

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

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

Да

Да

Нет

Да

Нет

Нет

Для закрепления материала рекомендуем прохождение тестов:
Тест знаний Java - Основы
Тест знаний Java - Средний уровень

Если Вам понравилась статья, проголосуйте за нее

Голосов: 64  loading...
SichikUA   gurn   Anatoly_Burov   flutesa   KvanGee   Akoemov   ya_paul   orion07   dezmond   lena12345678   sashk0   Uralec   jamal3200   VooDi   Ambal   Souichiro   lushta   Irdis   MarianaSemesta   DmitryCh   onishkov   Enshteinzh   Heorhi_Puhachou   chehonadskih   hjvfyfyfy   eka   hollow_hikari   FastForward77   lososs   pristroistvo_ek   chupika_bohdan1   iposta1   dotoni   Victor_MM   Selfing   sunrise4eva   kotslon   vsineln   Icess   alinarmi   SergioJavaist   Hedin504   valtair   taras4uprynka   mf15   sadpanda   IgnatPertov   fiz   Andronxxxxx   Raer   nofuruct   deingvard   Den_b   GREKSTAR   varidrift   MyPerfectSnail   shigabov   Kapko2311   Kirilovskiy   apple150   maringa   ksu239   hayo   lesscau