Java Core Flashcards
Чем различаются JRE, JVM и JDK?
- JVM (Java Virtual Machine) выполняет байт-код Java.
- JRE (Java Runtime Environment) - минимальная среда для исполнения Java-приложений, включает в себя JVM и стандартные библиотеки.
- JDK (Java Development Kit) - среда разработки на Java, включает JRE, компилятор, библиотеки и инструменты разработчика.
Какие существуют модификаторы доступа?
- private: доступ только внутри класса.
- default/package-private: доступ внутри пакета (модификатор по умолчанию).
- protected: доступ внутри пакета и в наследниках.
- public: общий доступ.
- Последовательность уровней закрытости: public, protected, default, private.
- Возможно изменение модификаторов в сторону большей видимости при наследовании (для поддержания соответствия принципу подстановки Барбары Лисков).
О чем говорит ключевое слово final?
- Запрещает наследование для класса.
- Препятствует переопределению метода.
- Позволяет переменным быть инициализированными только один раз.
- Запрещает изменение значений параметров метода и локальных переменных после их инициализации.
Какими значениями инициализируются переменные по умолчанию?
Значения по умолчанию:
- byte: (byte)0
- short: (short)0
- int: 0
- long: 0L
- float: 0f
- double: 0d
- char: ‘\u0000’
- boolean: false
- Объекты (включая String): null
Что вы знаете о функции main()?
Функция main():
- Точка входа в программу.
- Может быть несколько main() в приложении.
- Отсутствие main() приводит к ошибке при запуске.
- Синтаксис: public static void main(String[] args) {}
String[] args представляет собой механизм, с помощью которого можно передавать в Java-приложение данные прямо при его запуске. Это может быть полезно во многих случаях, например, если необходимо указать при запуске некоторые параметры настройки приложения, пути к файлам, значения переменных и т.д.
Какие логические операции и операторы вы знаете?
- &: Логическое AND (И)
- &&: Сокращённое AND
- |: Логическое OR (ИЛИ)
- ||: Сокращённое OR
- ^: Логическое XOR (исключающее OR (ИЛИ))
- !: Логическое унарное NOT (НЕ)
- &=: AND с присваиванием
- |=: OR с присваиванием
- ^=: XOR с присваиванием
- ==: Равно
- !=: Не равно
- ?: Тернарный (троичный) условный оператор
Что такое тернарный оператор выбора?
Тернарный оператор выбора (?:) - замена конструкции if-then-else. Формат: условие ? выражение1 : выражение2
. Если условие истинно, возвращается выражение1, иначе - выражение2. Оба операнда должны иметь совместимые типы.
Какие побитовые операции вы знаете?
~: Побитовый унарный оператор NOT;
&: Побитовый AND;
&=: Побитовый AND с присваиванием;
|: Побитовый OR;
|=: Побитовый OR с присваиванием;
^: Побитовый исключающее XOR;
^=: Побитовый исключающее XOR с присваиванием;
»: Сдвиг вправо (деление на 2 в степени сдвига);
»=: Сдвиг вправо с присваиванием;
»>: Сдвиг вправо без учёта знака;
»>=: Сдвиг вправо без учёта знака с присваиванием;
«: Сдвиг влево (умножение на 2 в степени сдвига);
«=: Сдвиг влево с присваиванием.
Где и для чего используется модификатор abstract?
- Применяется к классам и методам.
- Абстрактный класс не может иметь экземпляров и используется в качестве предка для других классов.
- Абстрактный метод не имеет реализации и должен быть переопределен в подклассах.
- Позволяет определить шаблон объекта, оставляя детали реализации для подклассов.
Дайте определение понятию «интерфейс». Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
- Ключевое слово interface используется для создания полностью абстрактных классов.
- Определяет, как можно использовать класс, который его реализует.
- Методы в интерфейсе неявно объявляются как public.
- С начала Java 8 в интерфейсах можно иметь методы с реализацией по умолчанию (default) и статические методы (static).
- Поля в интерфейсе являются public, static и final.
Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?
- Класс может реализовать несколько интерфейсов, но наследоваться только от одного класса.
- Абстрактные классы используются при наличии отношения “является” (is-a). Интерфейсы могут быть реализованы классами, которые не связаны между собой.
- Абстрактные классы предоставляют средства для избежания повторения кода и частичной реализации поведения. Интерфейсы описывают контракты и семантику класса.
- Интерфейсы позволяют создавать структуры типов без иерархии.
- Абстрактные классы содержат частичную реализацию, которая расширяется в подклассах. Интерфейсы могут содержать только сигнатуры методов и константы.
НО: начиная Java 8 в интерфейсах можно иметь методы с реализацией по умолчанию (default) и статические методы (static).
Почему в некоторых интерфейсах вообще не определяют методов?
Маркерные интерфейсы, например, Cloneable, не содержат методов и служат для указания принадлежности класса к определенному типу или поддержки конкретной функциональности, например, клонирования.
Почему нельзя объявить метод интерфейса с модификатором final?
В случае интерфейсов указание модификатора final бессмысленно, т.к. все методы интерфейсов неявно объявляются как абстрактные, т.е. их невозможно выполнить, не реализовав где-то еще, а этого нельзя будет сделать, если у метода идентификатор final.
Что имеет более высокий уровень абстракции - класс, абстрактный класс или интерфейс?
Интерфейс.
Может ли объект получить доступ к члену класса, объявленному как private? Если да, то каким образом?
- Внутри класса доступ открыт без ограничений.
- Вложенный класс имеет полный доступ к членам содержащего его класса.
- Извне доступ может быть организован через методы, предоставленные разработчиком, например, getX() и setX().
- Через рефлексию (Reflection API) с использованием setAccessible(true).
Каков порядок вызова конструкторов и блоков инициализации с учётом иерархии классов?
- Сначала вызываются все статические блоки сверху вниз по иерархии классов.
- Затем вызываются нестатические блоки инициализации и конструкторы сверху вниз по иерархии классов.
Пример:
- Сначала вызываются статические блоки: Parent, Child, Grandchild.
- Затем нестатические блоки и конструкторы: Parent, Child, Grandchild.
Зачем нужны и какие бывают блоки инициализации?
- Представляют код внутри класса, заключенный в фигурные скобки, вне методов или конструкторов.
- Бывают статическими и нестатическими.
- Выполняются перед инициализацией класса или созданием объекта.
- Может быть несколько и выполняются в порядке следования.
- Могут генерировать исключения, если их объявления перечислены в throws конструкторов.
- Могут существовать в анонимных классах.
К каким конструкциям Java применим модификатор static?
- Полям.
- Методам.
- Вложенным классам и интерфейсам.
- Блокам инициализации.
- Членам секции import.
Для чего в Java используются статические блоки инициализации?
Статические блоки инициализации в Java используются для выполнения кода один раз при инициализации класса загрузчиком классов перед созданием объектов. Эти блоки принадлежат самому классу, не связаны с конкретными объектами класса.
Что произойдёт, если в блоке инициализации возникнет исключительная ситуация?
- Для нестатических блоков инициализации требуется объявление исключения в throws всех конструкторах класса, иначе - ошибка компиляции.
- В случае статического блока выбрасывание исключения явно приводит к ошибке компиляции.
- В остальных случаях взаимодействие с исключениями аналогично другим местам: класс не будет инициализирован (статический блок) или объект не создан (нестатический блок).
Какое исключение выбрасывается при возникновении ошибки в блоке инициализации класса?
- Если исключение является наследником RuntimeException:
- Для статических блоков - ExceptionInInitializerError.
- Для нестатических - проброшено исключение-источник.
- Если исключение является наследником Error, в обоих случаях - Error.
- Исключение
java.lang.ThreadDeath
(смерть потока) не выбрасывается явно в данном контексте.
Может ли статический метод быть переопределён или перегружен?
- Может быть перегружен: два статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
- Не может быть переопределён, так как выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции). Синтаксически переопределение статического метода возможно, но всегда будет вызываться метод родителя.
Рекомендуется обращаться к статическим полям и методам через имя класса, а не объект.
Могут ли нестатические методы перегрузить статические?
Да, нестатические методы могут перегрузить статические, создав два различных метода, где статический метод будет принадлежать классу и вызываться через его имя, а нестатический - конкретному объекту.
Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
При переопределении метода в Java нельзя сузить модификатор доступа и изменить тип возвращаемого значения (кроме ситуаций, когда типы совместимы).