OOP Flashcards

1

1
Q

Что такое ООП?

A
  • Объектно-ориентированное программирование - методология, в которой программа состоит из взаимодействующих друг с другом объектов.
  • Преимущества: простота модификации, читаемость, повторное использование кода, удобная отладка и тестирование.
  • Недостатки: больше расход памяти, ниже производительность.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Базовые концепции ООП?

A
  • Инкапсуляция: объединяет данные и методы, скрывает детали реализации.
  • Наследование: создание нового класса на основе существующего, наследование свойств и методов.
  • Полиморфизм: использование одного интерфейса для разных реализаций метода.
  • Абстракция: разделение интерфейса объекта от его реализации для упрощения поддержки и расширения кода.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Укажите из каких элементов состоит класс. Расскажите о каждом из них.

A
  • Конструктор: метод, вызываемый при создании объекта.
  • Поля класса: переменные, хранящие данные объекта.
  • Методы класса: функции для работы с данными объекта.
  • Вложенные классы: классы внутри класса.
  • Модификаторы доступа: private, public, protected, default.
  • Блок инициализации: вызывается перед конструктором.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое конструктор?

A
  • Специальный метод, вызываемый при создании объекта.
  • Не имеет возвращаемого значения, используется для инициализации полей и называется так же как Класс.
  • Может быть перегружен.
  • Если конструктор не определён, компилятор создаёт конструктор по умолчанию.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Можно ли наследовать конструктор?

A
  • Конструктор не является членом класса, поэтому его нельзя наследовать.
  • С помощью ключевого слова super можно вызывать конструктор суперкласса из конструктора подкласса для создания экземпляра суперкласса.
  • super позволяет получить ссылку на суперкласс.
  • Необходимость вызова конструктора суперкласса возникает всегда, чтобы инициализировать унаследованные поля.
  • Если в подклассе не указан явный вызов конструктора суперкласса при помощи super(), компилятор добавляет вызов default конструктора суперкласса без аргументов.
  • Если в суперклассе существует конструктор с параметрами, его необходимо обязательно проинициализировать с помощью super() из конструктора подкласса.
  • Вызов super() должен быть первым в конструкторе подкласса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое перегрузка конструктора?

A
  • Перегрузка конструктора - это создание нескольких конструкторов в одном классе с разными параметрами.
  • Если изменить порядок параметров или их тип в конструкторе, такой конструктор также считается перегруженным.
  • Если аргументы не соответствуют ни одному из перегруженных конструкторов, компилятор выдаст ошибку.
  • При передаче методу ссылки на объект, сама ссылка передаётся с применением вызова по значению (call by value). Копия значения по-прежнему ссылается на тот же объект, что и исходный аргумент.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое статический метод?

A

Метод, вызываемый без создания экземпляра класса т.к. относится к классу, а не к его экземплярам.

  • Может обращаться только к статическим переменным и методам класса.
  • Нельзя переопределять.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое не статический метод?

A

Метод, который принадлежит объекту, а не классу.

  • Для его вызова необходимо сначала создать объект.
  • Имеет доступ ко всем полям и методам объекта.
  • Имеет скрытый параметр this, который указывает на текущий объект.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Для чего используется ключевое слово this?

A

Ключевое слово this используется для обращения к текущему объекту класса.

Позволяет:

  • Отличать поле класса от параметра метода или локальной переменной с тем же именем.
  • Вызывать один конструктор из другого в том же классе.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какой класс является базовым родительским классом для всех классов?

A
  • Класс java.lang.Object является базовым родительским классом для всех классов. Он определяет базовые методы, которые наследуются всеми классами:
    • clone() создаёт копию объекта и возвращает на него ссылку .
    • equals(Object) определяет, равен ли один объект другому.
    • getClass() возвращает класс объекта во время выполнения.
    • hashCode() возвращает хеш-код текущего объекта.
    • notify() возобновляет поток, ожидающий этот объект.
    • notifyAll() возобновляет все потоки, ожидающие этот объект.
    • toString() возвращает строковое представление текущего объекта.
    • wait() заставляет текущий поток ожидать, пока другой поток не вызовет метод notify() или notifyAll() для этого объекта.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое наследование? Приведите примеры из реальной жизни.

A
  • Механизм ООП, позволяющий создавать новые классы на основе уже существующих.
  • Подкласс наследует все поля и методы суперкласса (кроме private).
  • Позволяет повторно использовать код и создавать иерархию классов.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Опишите процесс создания нового объекта.

A
  • При помощи оператора new вызывается конструктор класса.
  • JVM выделяет память в Heap и инициализирует поля значениями переданными в конструкторе или значениями по умолчанию.
  • Конструктор возвращает ссылку на созданный объект для доступа к его полям и методам.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как вызвать метод из родительского класса?

A
  • С помощью ключевого слова super можно вызвать метод из родительского класса.
  • Применяется в тех случаях, когда подкласс переопределяет методы или поля суперкласса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое переопределение метода?

A

Переопределение метода (overriding) — это создание метода в подклассе с той же сигнатурой и типом возвращаемого значения, что и у метода суперкласса.

  • При вызове метода у объекта подкласса будет вызываться переопределенный метод подкласса, скрывая метод суперкласса.
  • Для доступа к методу суперкласса используется ключевое слово super.
  • Для того, чтобы убедиться, что метод переопределен, используют аннотацию @Override, которая вызывает ошибку компиляции, если метод не найден в суперклассе.
  • Решение о вызове переопределенного метода принимается на этапе выполнения программы при помощи т.н. позднего связывания. Вызывается метод из класса, на который ссылается переменная.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Можно ли переопределить статический метод?

A

Статические методы нельзя переопределять, так как они принадлежат классу, а не объекту.

  • Переопределять можно только не статические методы.
  • Если в подклассе переопределить статический метод суперкласса, это называться “сокрытием метода суперкласса”.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое сокрытие метода?

A

Сокрытие статического метода происходит, если подкласс объявляет статический метод с той же сигнатурой, что и у суперкласса.

  • Вызов метода происходит на основе типа ссылки на объект во время компиляции, а не во время выполнения.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Что такое виртуальная функция и используются ли они в Java?

A

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

  • Все не статические методы Java являются виртуальными, кроме private и final.
  • Статические методы не являются виртуальными, так как не могут быть переопределены.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое перегрузка метода?

A

Механизм, позволяющий создавать методы с одинаковыми именами, но разными параметрами.

  • Возвращаемое значение не входит в сигнатуру метода.То есть методы должны быть определены с различной сигнатурой метода.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Можно ли изменить тип возвращаемых данных при перегрузке метода?

A
  • Тип возвращаемых данных не входит в сигнатуру метода, поэтому только изменение типа возвращаемых данных не приведет в перегрузке метода.
  • Сигнатура метода должна отличаться хотя бы одним из параметров.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Что такое множественное наследование?

A
  • Множественное наследование - это наследование свойств и методов от нескольких суперклассов.
  • В Java множественное наследование классов запрещено, но класс может реализовать несколько интерфейсов.
  • При реализации нескольких интерфейсов необходимо переопределить @Override все абстрактные методы интерфейсов.
  • Конфликты имен с одинаковым default методом решаются с помощью явного указания имени метода.
    MyInterface.super.myMethod();
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Что такое полиморфизм? Приведите примеры из реальной жизни.

A

Полиморфизм - это принцип ООП, позволяющий использовать один интерфейс для общего класса действий и обеспечивать различную реализацию методов в разных классах.

  • Полиморфизм достигается с помощью интерфейсов или переопределения методов при наследовании.

Примеры:

  • Интерфейс Animal с методом makeSound(). Классы Dog и Cat реализуют его, издавая звуки “гав” и “мяу” соответственно. Используя переменную типа Animal, мы получаем звук в зависимости от конкретного объекта.
  • Интерфейс Payment с методом processPayment(). Классы CreditCardPayment и PayPalPayment реализуют его для обработки платежей кредитной картой и через PayPal соответственно. Метод processPayment() работает в зависимости от типа платежа.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Что такое инкапсуляция?

A

Инкапсуляция - это механизм ООП, который позволяет объединить данные и методы, которые их обрабатывают, в один класс (капсула) и скрыть детали реализации от пользователя, предоставляя только интерфейс взаимодействия.

  • Достигается с помощью модификаторов доступа, которые контролируют доступ к полям и методам класса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Как реализована инкапсуляция в Java?

A

Инкапсуляция в Java реализована с помощью классов и модификаторов доступа.

Существуют 4 модификатора доступа:
- public (везде)
- protected (внутри пакета + наследники)
- default (внутри пакета)
- private (внутри класса)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Можно ли применить модификаторы доступа к конструкторам?

A

Да, модификаторы доступа можно применять к конструкторам для ограничения доступа к созданию объектов определёнными классами или пакетами.

  • Такой подход используется в паттерне проектирования Singleton, либо когда мы хотим запретить создание экземпляров класса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Что такое интерфейс?
**Интерфейс - это абстрактный тип данных, который определяет набор методов без реализации, которые должны быть реализованы всеми классами, реализующими данный интерфейс.** * Интерфейсы не могут хранить состояния, и их переменные неявно являются public static final. * Допустимые модификаторы доступа: `default` и `public`. Для методов интерфейса неявно устанавливается модификатор `public`. Сам интерфейс должен быть явно объявлен как `public`. * Интерфейс отделяет поведение от реализации.
26
Перечислите элементы, которые может содержать интерфейс.
Интерфейс может содержать: * Поля (константы): public static final. * Методы без реализации: public abstract * static методы с реализацией. default методы с реализацией. private методы для использования внутри других методов интерфейса. * Вложенные классы и интерфейсы (public и static). * Обобщённые типы (generics). * Перечисления (enum).
27
Можно ли создать объект интерфейса? Если да, то как?
Нельзя создать объект интерфейса напрямую, т.к. он не может содержать конструкторы. Однако можно создать объект класса, который реализует данный интерфейс.
28
Может ли интерфейс содержать какие-либо методы с реализацией? Если да, то какие?
* **default методы**: могут быть переопределены в классах, реализующих интерфейс. * **static методы** - могут вызываться напрямую через интерфейс, без создания экземпляра класса. * **private методы** - могут вызываться только другими методами внутри интерфейса.
29
Что такое абстракция?
**Абстракция - это механизм ООП, который позволяет разделить интерфейс объекта от его реализации.** * Абстракция упрощает поддержку, расширение и повторное использование кода. * Реализуется с помощью абстрактных классов и интерфейсов.
30
Что такое абстрактный класс?
**Абстрактный класс - это класс, который определяет общее поведение для будущих подклассов, но не содержит полную реализацию всех методов.** * Может содержать как абстрактные методы, так и методы с реализацией. * Нельзя создавать объекты абстрактного класса. * Не может быть final, так как должен быть унаследован. * Подклассы обязаны реализовать все его абстрактные методы (если только они сами не абстрактные). * Используется для предоставления **общей функциональности нескольких связанных классов** и когда при этом необходимо **запретить создание объектов** класса напрямую.
31
Сколько абстрактных методов должен и может содержать абстрактный класс?
* Абстрактный класс может содержать любое количество абстрактных методов, включая нулевое. * Объявление класса абстрактным бывает полезным, когда необходимо запретить создание объектов класса.
32
Может ли абстрактный класс содержать обычные методы?
* Да, абстрактный класс может содержать обычные методы с реализацией. * Обычные методы могут быть использованы для определения общей реализации, которая будет наследоваться всеми подклассами абстрактного класса.
33
Сколько объектов абстрактного класса можно создать в программе?
Нельзя создавать объекты абстрактного класса.
34
Что нужно делать, если наследник абстрактного класса не переопределяет все абстрактные методы родителя?
Если подкласс не реализует все абстрактные методы суперкласса, то он должен быть объявлен абстрактным.
35
Чем отличается интерфейс от абстрактного класса?
* Интерфейс описывает только поведение. **У интерфейса нет состояния** (переменные являются константами satic final), а **у абстрактного класса состояние есть и он описывает и поведение и состояние**. * Абстрактный класс связывает между собой классы, имеющие очень близкую связь, а один и тот же интерфейс могут реализовать классы у которых вообще нет ничего общего. * Классы могут реализовывать сколько угодно интерфейсов, но наследоваться можно только от одного класса. * В отличие от интерфейсов, абстрактные методы в абстрактных классах должны быть явно объявлены как абстрактные. * Абстрактные классы могут иметь конструкторы, в то время как интерфейсы не могут.
36
Что такое вложенные классы? Зачем они нужны?
**Вложенный (nested) класс** - класс, который объявлен внутри другого класса или интерфейса. - Имеет область действия равную области действия внешнего класса; - Имеет доступ к членам внешнего класса, в т.ч. private; - Внешний класс не имеет доступа к членам внутреннего; - Вложенный класс не существует независимо от внешнего класса; **Вложенные классы делятся на:** - Статические (static); - Нестатические; **Когда используются?** - Когда реализуемый класс необходимо скрыть от других классов того же пакета, т.е. повысить инкапсуляцию; - Когда необходим полный доступ к полям и методам класса, членом которого будет являться вложенный класс; - Для увеличения логической связанности и читаемости кода, когда вложенный класс используется только во внешнем классе и располагается ближе к месту использования.
37
Какие типы вложенных классов существуют в Java?
Существует 4 типа вложенных классов: - Статические (static) ; - Нестатические (внутренние классы); - Внутренние; - Локальные; - Анонимные; Основное отличие между различными типами вложенных классов заключается в их области видимости и доступе к членам внешнего класса. **Статический вложенный класс имеет доступ только к статическим членам, но внутренний, локальный и анонимный классы имеют доступ ко всем членам внешнего класса.**
38
Что такое внутренний класс? Когда он применяется?
**Внутренний (inner) класс** - нестатический вложенный класс, связанный с объектом внешнего класса. - Имеет доступ ко всем полям и методам (включая private) внешнего класса и *может обращаться к ним напрямую*; - Применяются, когда класс должен иметь доступ к членам внешнего класса и у него есть логическая связь с внешним классом.
38
Что такое статический вложенный класс? Когда он применяется?
**Статический вложенный класс** - это класс, объявленный внутри другого класса с помощью модификатора static. **Принадлежит к внешнему классу (является его членом), а не экземпляру класса.** * Имеет доступ **только** к статическим полям и методам внешнего класса (в т.ч. private); * Может содержать статические и нестатические поля и методы; * Может наследовать обычные классы и быть наследован *любым классом*!; * Область видимости определяется согласно модификатора доступа; **Когда применяется?** - **Применяется для группировки классов, когда класс не нуждается в доступе к объекту внешнего класса и должен использоваться независимо от его объектов.**
39
Сколько объектов статического вложенного класса можно создать в программе?
**Можно создавать неограниченное количество объектов статического вложенного класса.** * Не имеет доступа к нестатическим членам внешнего класса и при его создании не создаётся связь с экземпляром внешнего класса.
40
Что такое локальный класс? Когда он применяется?
**Локальный класс** - это класс, который объявляется внутри блока кода (метода). * Область видимости как у локальной переменной; * Не является членом внешнего класса; - В зависимости от того, в каком контексте объявлен - static, non static, имеет доступ либо только к статическим, либо ко всем (включая private) полям и методам внешнего класса; - Может быть использован неоднократно; - В нестатическом контексте содержит ссылку на внешний класс; - Время жизни ограничено временем жизни блока кода, в котором объявлен, либо существующими ссылками на объект этого класса; - В объявлении локального класса допустим только модификатор final. - Работает только с final или Effective final переменными; - Может содержать в себе нестатические свойства и методы и статические константы (static final); - Может наследовать: - обычные классы; - внутренние классы, определенные во внешнем классе и его предках; - локальные классы, определенные в том же методе; - Может быть наследован локальным классом, определенным в том же методе; - Может имплементировать интерфейс; **Когда он применяется?** - Локальный класс применяется, когда нужен класс для использования только в пределах метода или блока кода.
41
Что такое анонимный класс? Когда он применяется?
**Анонимный класс** - это локальный класс без имени, который обязательно **наследует какой-либо класс или реализует какой-либо интерфейс**. **Применяется в случае, когда нам необходим локальный класс для одноразового использования.** - Имеет доступ к членам внешнего класса и локальным переменным (final или effectively final). - Может содержать в себе только нестатические переменные и методы. - Анонимный класс живет, пока на него существует ссылка; - Виден только в методе, в котором определён; - Не может быть наследован;
42
Сколько объектов анонимного класса можно создать в программе?
Анонимный класс не имеет имени и его экземпляр создается сразу же вместе с его объявлением, поэтому **можно создать только один объект анонимного класса**.
43
Что такое исключения? Какие типы исключительных ситуаций бывают?
**Исключения** - это механизм обработки ошибок, который позволяет писать более надёжный и безопасный код. Для обработки исключений используются: * Блоки **try, catch, finally** * Оператор **throws** после сигнатуры метода, чтобы передать исключение на более высокий уровень в стеке вызовов методов. * Ключевое слово **throw** для генерации исключений вручную. Cуществуют два типа исключений: **Проверяемые исключения (Checked exceptions)** - это исключения, которые **проверяются во время компиляции** и **должны быть обработаны** с помощью блока **try-catch**, либо объявлены после сигнатуры метода с помощью оператора **throws**, **иначе код не cкомпилируется**. * Класс Exception (кроме класса RuntimeException и его подклассов). **Непроверяемые исключения (Unchecked exceptions)** — это исключения, которые  **появляются во время выполнения** программы и их обработка не обязательна (но возможна). * Класс Error и его подклассы. * Класс RuntimeException и его подклассы. Все типы исключений являются подклассами **Throwable**, который делится на подклассы: * **Error** - крит. ошибки JVM. * **Exception**. **Exception** разделяется на подклассы: * **RuntimeException** * **Остальные классы** ** Классы Error, RuntimeException и всех их подклассы относятся к непроверяемым (unchecked) исключениям.** **Если в блоке try возникнет исключение, код после него уже не будет выполнен.**
44
Назовите основные методы класса Object?
* **clone()** создаёт копию объекта и возвращает на него ссылку . * **equals(Object)** определяет, равен ли один объект другому. * **getClass()** возвращает класс объекта во время выполнения. * **hashCode()** возвращает хеш-код текущего объекта. * **notify()** возобновляет поток, ожидающий этот объект. * **notifyAll()** возобновляет все потоки, ожидающие этот объект. * **toString()** возвращает строковое представление текущего объекта. * **wait()** заставляет текущий поток ожидать, пока другой поток не вызовет метод notify() или notifyAll() для этого объекта.
45
Что такое шаблоны проектирования?
**Шаблоны проектирования** — это **повторно используемые решения** для **типичных задач** при проектировании ПО. - **Порождающие паттерны** - обеспечивают гибкость в создании; - **Структурные паттерны** - заботятся о связях между объектами; - **Поведенческие паттерны** - эффективная коммуникация;
46
Объясните шаблон - декоратор. Придумайте пример, не относящийся к технике.
**Шаблон Декоратор** (Decorator) - позволяет динамически добавлять функциональность объекту без изменения его структуры. **Пример** в кофе добавляют молоко, сахар, сливки или шоколад, создавая новые "версии" кофе. Структура: 1. **Компонент** - задает общий интерфейс как обёрток, так и оборачиваемых объектов. 2. **Конкретный компонент** - содержит базовое поведение, изменяемое декораторами. 3. **Базовый декоратор** - хранит ссылку на вложенный объект-компонент, который может быть как оборачиваемым объектом, так и объектом-обёрткой. Делегирует все свои операции вложенному объекту. Дополнительное поведение определяется в конкретных декораторах. 4. **Конкретные декораторы** - различные вариации декораторов, содержащие добавочное поведение, выполняемое до или после вызова аналогичного поведения обернутого объекта. 5. **Клиент** - может оборачивать простые компоненты и декораторы в другие декораторы (слоями), работая со всеми через общий интерфейс компонентов.
47
Объясните шаблон - стратегия. Придумайте пример, не относящийся к технике.
**Шаблон стратегия** (Strategy) - определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы. **Пример**: доставка почтовых посылок разными способами (почта, курьер, дрон), которые выбираются в зависимости от условий. Структура: * **Context (Strategy client)** - Класс - клиент, который содержит: 1. Поле - ссылку на конкретную реализацию стратегии; 2. Сеттер для установки ссылки на конкретную реализацию стратегии; 3. Метод для вызова конкретного метода из назначенной реализации стратегии; * **Strategy** - Интерфейс или абстрактный класс, описывающий поведение конкретных стратегий; * **Concrete strategy** - Конкретные классы-стратегии, реализующие методы, описанные в Strategy;
48
Объясните шаблон - синглтон. Придумайте пример, не относящийся к технике.
**Шаблон Singleton** - гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру через отдельный метод. **Пример:** Воронка имеет один узкий выход, через который жидкость или сыпучие материалы проходят в контейнер. 1. Создаем приватный конструктор, 2. Статическое поле instance (private static) 3. Статический метод getInstance() (public static), который является глобальной точкой доступа к экземпляру класса. Он проверяет был ли уже создан объект (присвоен переменной instance) и возвращает его или создает новый.
49
Объясните шаблон - фабричный метод. Придумайте пример, не относящийся к технике.
**Фабричный метод** — предоставляет интерфейс для создания объектов, позволяя подклассам решать, какой объект создать. **Пример**: создание различных персонажей в игре (воин, маг, лучник) через фабричный метод. Структура: 1. **Продукт** определяет общий интерфейс объектов, которые может произвести создатель и его подклассы. 2. **Конкретные продукты** содержат код различных продуктов. Продукты будут отличаться реализацией, но интерфейс у них будет общий. 3. **Создатель** объявляет фабричный метод, который должен возвращать новые объекты продуктов. Важно, чтобы тип результата совпадал с общим интерфейсом продуктов. Зачастую фабричный метод объявляют абстрактным, чтобы заставить все подклассы реализовать его по-своему. Но он может возвращать и некий стандартный продукт. Несмотря на название, важно понимать, что создание продуктов **не является** единственной функцией создателя. Обычно он содержит и другой полезный код работы с продуктом. Аналогия: большая софтверная компания может иметь центр подготовки программистов, но основная задача компании — создавать программные продукты, а не готовить программистов. 4. **Конкретные создатели** по-своему реализуют фабричный метод, производя те или иные конкретные продукты. Фабричный метод не обязан всё время создавать новые объекты. Его можно переписать так, чтобы возвращать существующие объекты из какого-то хранилища или кэша.
50
Что такое enum? Когда можно его применять?
**Enum** (перечисление) — это специальный класс, который содержит ограниченный набор констант (static final) - объектов, связанных между собой по смыслу. Каждый элемент перечисления является экземпляром этого класса. * Может содержать конструкторы, поля, методы (включая абстрактные). * Может реализовывать интерфейсы. * Неявно наследуется от java.lang.Enum, поэтому он не может наследоваться от других классов. * Является неявно public final class и от него нельзя наследоваться. * Enum нельзя объявить абстрактным, потому что у нас нет возможности его наследовать (final), но в нём можно объявить абстрактные методы. * Тип каждого элемента перечисления — это сам тип перечисления. * Экземпляры перечисления не являются объектами анонимных подклассов по умолчанию. Они становятся таковыми только если вы явно переопределяете методы или добавляете поведение для конкретного элемента. Методы класса Enum: * name() - возвращает имя константы. * ordinal() - возвращает порядковый номер константы. * values() - возвращает массив всех элементов перечисления. * valueOf() возвращает константу по имени. **Применяется для представления набора неизменяемых констант (например, дни недели, месяцы, статусы).** **Используют для того, чтобы ограничить количество используемых объектов (в отличии от обычного класса).**
51
Что такое record? Когда можно его применять?
**Record** - это неизменяемая модель данных, записанная в виде одной строки. Используется для быстрого создания моделей. Добавлено в Java 14. **`public record Person(String name, int age) { }`** * Автоматически генерирует конструктор, геттеры, equals(), hashCode() и toString(). * Поля по умолчанию private и final. * Не имеет методов set. * Можно добавлять свои методы и переопределять существующие. * Используется для создания DTO, моделей данных и API Responses.
51
Зачем нужны StringBuilder, StringBuffer, StringJoiner? Что они делают
* **StringBuilder** — **используется для создания изменяемых строк, позволяет добавлять строки без создания новых объектов.** * **StringBuffer** — аналог StringBuilder, но потокобезопасный, используется в многопоточной среде. * **StringJoiner** — **объединяет строки с заданным разделителем. Позволяет задать префикс и суффикс для итоговой строки.**
52
Чем отличаются StringBuffer и StringBuilder?
* **StringBuilder** — не синхронизирован, не потокобезопасен, более производителен. * **StringBuffer** — синхронизирован, потокобезопасен, используется в многопоточной среде.
53
Каким образом производится экранирование символов и зачем это нужно?
* **Экранирование производится при помощи обратного слэша \ перед специальными символами, чтобы интерпретировать их как часть строки.** * Это необходимо для **создания строк с особыми символами**, работы с регулярными выражениями, SQL-запросами и пользовательским вводом.
54
Что такое управляющие последовательности?
**Управляющая последовательность** - это комбинация обратного слэша \ и экранируемого им символа: * **\'** - Добавляет одинарную кавычку * **\"** - Добавляет двойную кавычку * **\\** - Добавляет обратный слэш * **\r** - Возврат курсора в начало строки * **\n** - Перевод курсора на новую строку * **\f** - Прогон страницы * **\t** - Табуляция * **\b** - Возврат курсора на одну позицию назад
55
Зачем нужно форматирование данных? Метод format()
* **Форматирование необходимо для подстановки в строках различных значений, принимаемых в виде параметров.** Метод **format()** класса **java.util.Formatter** используется для **форматирования строк с различными спецификаторами формата**: * **%n** — новая строка * **%b** — boolean * **%c** — символ Unicode * **%s** — строка * **%d** — целое число * **%f** — число с плавающей точкой * **%tF** — дата "год-месяц-день" * **%tT** — время "чч:мм:сс" * **%%** — знак %
56
Что такое varargs? В каких случаях стоит его применять?
**Varargs** (variable arguments) — это механизм, позволяющий методам принимать аргументы произвольной длины одного типа. * В одном методе может быть только один параметр varargs. * varargs подразумевает 0 и более аргументов. * Параметр varargs всегда должен быть объявлен последним в списке параметров метода. * varargs неявно помещаются в массив и передаются в метод. Если аргументов нет, то длина массива будет равна 0. * Применяется, когда количество аргументов метода может варьироваться.
57
В каких случаях может возникнуть неоднозначность при работе с varargs?
Неоднозначность возникает при перегрузке методов и приводит к ошибке компиляции. * Перегрузка методов с varargs разных типов при вызове метода без параметров. * Одна из перегрузок использует varargs, а другая — массив. Неоднозначность можно разрешить путём отказа от перегрузки и объявления такого же метода, но с другим именем.
58
Что такое форматированный вывод? Какие механизмы позволяют осуществить форматированный вывод?
**Форматированный вывод преобразует данные в нужный формат.** Механизмы: * Метод **String.format()** * Метод **PrintStream.printf()**