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 нельзя сузить модификатор доступа и изменить тип возвращаемого значения (кроме ситуаций, когда типы совместимы).
Возможно ли при переопределении метода изменить:
- модификатор доступа;
- возвращаемый тип;
- тип аргумента или их количество;
- имена аргументов или их порядок;
Убирать, добавлять, изменять порядок следования элементов секции throws?
- нельзя сужать модификатор доступа, т.к. это приведёт к нарушению принципа подстановки Барбары Лисков.
Например, если метод в суперклассе имеет модификатор protected, в подклассе его нельзя переопределить с модификатором private. Можно усилить уровень доступа (например, с protected на public), но не наоборот; - не рекомендуется изменять возвращаемый тип. Но можно использовать подтип возвращаемого типа. Это означает, что подкласс может возвращать подкласс или подтип возвращаемого типа, указанного в суперклассе. Но нельзя изменить возвращаемый тип на его супертип;
- нельзя изменять тип аргумента или их количество. Метод в подклассе должен иметь точно такую же сигнатуру (типы аргументов и их количество), как и метод в суперклассе;
- можно изменить имена аргументов без нарушения правил переопределения. Однако порядок аргументов должен оставаться тем же;
- при переопределении метода можно расширить (добавить подтипы) секцию throws (исключения), но нельзя сужать ее. Если суперкласс объявляет, что метод может бросать исключение определенного типа, подкласс может бросать исключение этого типа или его подтип.
Как получить доступ к переопределенным методам родительского класса?
Для доступа к переопределенным методам родительского класса в Java используется ключевое слово super
.
Можно ли объявить метод абстрактным и статическим одновременно?
Нельзя. Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
В чем разница между членом экземпляра класса и статическим членом класса?
Модификатор static указывает на то, что член класса принадлежит самому классу и доступен без создания объекта. Статические методы и поля инициализируются при загрузке класса и имеют ограничения по вызову других методов и доступу к переменным. Экземплярные члены принадлежат объекту класса, и каждый объект может иметь свои уникальные значения для этих членов.
Где разрешена инициализация статических/нестатических полей?
Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
Какие типы классов бывают в java?
- Top level class (Обычный класс):
- Abstract class (Абстрактный класс);
- Final class (Финализированный класс).
- Interfaces (Интерфейс).
- Enum (Перечисление).
- Nested class (Вложенный класс):
- Static nested class (Статический вложенный класс);
- Member inner class (Простой внутренний класс);
- Local inner class (Локальный класс);
- Anonymous inner class (Анонимный класс).
Расскажите про вложенные классы. В каких случаях они применяются?
Вложенные классы (Nested class) в Java делятся на четыре категории и их использование зависит от ситуации:
- Static nested class (Статический вложенный класс), подходит, когда класс нужен в других контекстах;
- Member inner class (Простой внутренний класс), используется, когда нужен доступ к полям и методам внешнего класса;
- Local inner class (Локальный класс), подходит, когда класс нужен только внутри метода;
- Anonymous inner class (Анонимный класс), уместен, когда класс используется в единственном месте и уже существует тип, характеризующий этот класс.
Что такое «статический класс»?
Вложенный класс, объявленный с использованием ключевого слова static. Модификатор static не применяется к классам верхнего уровня.
Какие существуют особенности использования вложенных классов: статических и внутренних? В чем заключается разница между ними?
Вложенные классы могут обращаться ко всем членам обрамляющего класса, включая приватные.
Статический вложенный класс не требует создания объекта внешнего класса для своего использования. А также не имеет доступа к нестатическим членам внешнего класса напрямую.
Обычные вложенные классы не могут содержать статических методов, блоков инициализации и классов, в отличие от статических вложенных классов. Объект обычного вложенного класса хранит ссылку на объект внешнего класса, в то время как внутри статического вложенного класса такой ссылки нет, и доступ осуществляется через указание .this
после имени внешнего класса.
Что такое «локальный класс»? Каковы его особенности?
Local inner class (Локальный класс) - это вложенный класс, объявленный внутри блока кода. Он имеет следующие особенности:
- Виден только в пределах блока, в котором объявлен.
- Не может быть объявлен как private/public/protected или static.
- Не может содержать статических методов или классов, но может иметь финальные статические поля.
- Имеет доступ к полям и методам обрамляющего класса.
- Может обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором final.