OOP Flashcards

1 (60 cards)

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, protected, public, 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(…) или неявно компилятором — чтобы инициализировать унаследованные поля.
  • Если в подклассе не указан явный вызов конструктора суперкласса, компилятор добавляет вызов default конструктора суперкласса без аргументов.
  • Если в суперклассе есть только параметризованный конструктор, его нужно вызвать явно через super(…).
  • Вызов super() должен быть первым в конструкторе подкласса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

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

A

Перегрузка конструктора (overloading) - это создание нескольких конструкторов в одном классе с разными параметрами.

  • Если изменить порядок параметров или их тип в конструкторе, такой конструктор также считается перегруженным.
  • Если аргументы не соответствуют ни одному из перегруженных конструкторов, компилятор выдаст ошибку.
  • При передаче методу ссылки на объект, сама ссылка передаётся с call by value. Копия значения по-прежнему ссылается на тот же объект, что и исходный аргумент.

Overriding (переопределение) — в подклассе метод с тем же именем, сигнатурой и возвращаемым типом, как в суперклассе.

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

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

A

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

  • Может обращаться только к статическим переменным и методам класса.
  • Не может быть переопределён, но может быть скрыт (hidden) при совпадении сигнатур в подклассе.
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 — это ссылка на текущий объект класса.

Позволяет:

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

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

A

java.lang.Object — базовый класс всех классов в Java. Он определяет методы, унаследованные всеми классами:

  • clone() — создаёт копию объекта и возвращает на неё ссылку .
  • equals(Object) — проверяет объекты на равенство.
  • getClass() — возвращает класс объекта во время выполнения.
  • hashCode() — возвращает хеш-код объекта.
  • toString() — возвращает строковое представление объекта.
  • wait() — приостанавливает текущий поток до вызова notify() / notifyAll().
  • 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.
  • Применяется, когда подкласс переопределяет (overriding) метод суперкласса.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

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

A

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

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

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

A

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

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

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

A

Сокрытие (method hiding) — это ситуация, когда подкласс объявляет статический метод с той же сигнатурой, что и в суперклассе.

  • Статические методы вызываются по типу ссылки (класса) — на этапе компиляции.
  • Нестатические методы вызываются по реальному типу объекта во время выполнения (runtime).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

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

A

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

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

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

A

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

  • Возвращаемое значение не входит в сигнатуру метода. Методы должны быть определены с различной сигнатурой метода.
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

Инкапсуляция реализуется через классы и модификаторы доступа.

  • 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. * Методы интерфейса неявно public, допустимы модификаторы default и static. * Интерфейс объявляется как public. * Интерфейс отделяет поведение от реализации.
26
Перечислите элементы, которые может содержать интерфейс.
Интерфейс может содержать: * **Константы** — public static final. * **Абстрактные методы** — public abstract. * **static методы**. * **default методы**. * **private методы** — для использования внутри интерфейса. * **Вложенные классы и интерфейсы**. * **Enum**.
27
Можно ли создать объект интерфейса? Если да, то как?
* Напрямую объект интерфейса создать **нельзя**, так как интерфейс **не имеет конструктора**. * Однако можно создать объект класса, который реализует данный интерфейс.
28
Может ли интерфейс содержать какие-либо методы с реализацией? Если да, то какие?
* **default методы**: могут быть переопределены в классах, реализующих интерфейс. * **static методы** - могут вызываться напрямую через интерфейс, без создания экземпляра класса. * **private методы** - могут вызываться только другими методами внутри интерфейса.
29
Что такое абстракция?
**Абстракция** — это принцип ООП, позволяющий **отделить интерфейс объекта от его реализации**. * Упрощает поддержку, расширение и повторное использование кода. * Реализуется с помощью **абстрактных классов** и **интерфейсов**.
30
Что такое абстрактный класс?
**Абстрактный класс** — это класс, который **задаёт общее поведение подклассов**, но **не содержит полной реализации** всех методов. * Может содержать как **абстрактные**, так и **обычные методы**. * **Нельзя создавать объекты** абстрактного класса. * Не может быть final, т.к. предназначен для **наследования**. * Подклассы обязаны **реализовать все абстрактные методы**, если только они сами не абстрактные. * Используется, чтобы **объединить общую логику** и **запретить прямое создание экземпляров**.
31
Сколько абстрактных методов должен и может содержать абстрактный класс?
* Абстрактный класс может содержать **любое количество** абстрактных методов, включая **нулевое**. * Класс можно объявить абстрактным, чтобы **запретить создание его объектов**.
32
Может ли абстрактный класс содержать обычные методы?
* Да, абстрактный класс может содержать **обычные методы с реализацией**. * Такие методы используются для определения **общей логики**, которая **наследуется всеми подклассами** абстрактного класса.
33
Сколько объектов абстрактного класса можно создать в программе?
**Нельзя создавать объекты абстрактного класса.**
34
Что нужно делать, если наследник абстрактного класса не переопределяет все абстрактные методы родителя?
Если подкласс **не реализует все абстрактные методы суперкласса**, то он **должен быть объявлен абстрактным**.
35
Чем отличается интерфейс от абстрактного класса?
* **Интерфейс** описывает только **поведение** — не хранит состояние (все поля public static final), а абстрактный класс может иметь **состояние** (поля) и **поведение** (методы). * Абстрактный класс связывает между собой близкие по смыслу классы, а интерфейс могут реализовать несвязанные классы. * Класс может реализовать сколько угодно интерфейсов, но наследоваться можно только от одного класса. * В отличие от интерфейсов, абстрактные методы в абстрактных классах должны быть явно объявлены как abstract. * Абстрактные классы могут иметь конструкторы, интерфейсы — нет.
36
Что такое вложенные классы? Зачем они нужны?
**Вложенный (nested) класс** — это класс, объявленный внутри другого класса или интерфейса. * Имеет область видимости внешнего класса. * Имеет доступ к его членам, включая private. * Внешний класс не имеет доступа к членам вложенного. * Не существует независимо от внешнего класса. **Типы вложенных классов** - Статические (static nested) - Нестатические (inner) **Используются** * Для повышения инкапсуляции — скрытия служебных классов. * Для доступа к членам внешнего класса. * Для логической группировки классов, связанных по смыслу.
37
Какие типы вложенных классов существуют в Java?
Существует 4 типа вложенных классов: - **Статические** (static) ; - **Нестатические** (inner); - **Внутренние**; - **Локальные**; - **Анонимные**; Различия: * Статический вложенный класс имеет доступ **только к статическим членам** внешнего класса. * **Внутренний, локальный и анонимный** классы имеют доступ **ко всем членам** внешнего класса, включая private.
38
Что такое внутренний класс? Когда он применяется?
**Внутренний (inner) класс**— это **нестатический вложенный класс**, связанный с экземпляром внешнего класса. - Имеет доступ ко **всем полям и методам** внешнего класса, включая private и *может обращаться к ним напрямую*; - Применяются, когда класс должен иметь доступ к членам внешнего класса и у него есть с ним логическая связь.
38
Что такое статический вложенный класс? Когда он применяется?
**Статический вложенный класс** - это класс, объявленный внутри другого класса с модификатором static. * **Принадлежит к внешнему классу (является его членом), а не экземпляру класса.** * Имеет доступ **только к статическим** членам внешнего класса (включая private). * Может содержать статические и нестатические поля и методы. * Может наследовать другие классы и быть унаследован *любым классом*. * Область видимости определяется модификатором доступа. **Когда применяется?** - Когда вложенный класс **не нуждается в доступе** к экземпляру внешнего класса. - Для логической группировки классов и повышения **инкапсуляции**.
39
Сколько объектов статического вложенного класса можно создать в программе?
**Можно создавать неограниченное количество объектов статического вложенного класса.** * Он **не связан** с экземпляром внешнего класса. * Не имеет доступа к **нестатическим членам** внешнего класса.
40
Что такое локальный класс? Когда он применяется?
**Локальный класс** — это класс, объявленный **внутри метода, конструктора или блока кода**. * Имеет область видимости, ограниченную блоком, где объявлен. * Не является членом внешнего класса. * В нестатическом контексте имеет доступ ко всем членам внешнего класса (включая private). * В статическом контексте — только к статическим членам. * Может использовать только final или effectively final локальные переменные. * Может содержать нестатические поля и методы и статические константы (static final). * Существует, пока существует блок, где он объявлен, или ссылки на его объект. * Допустим только модификатор final в объявлении. Когда применяется: * Когда требуется вспомогательный класс, используемый только внутри метода или конкретного блока кода.
41
Что такое анонимный класс? Когда он применяется?
**Анонимный класс** - это **локальный класс без имени**, который обязательно **наследует класс или реализует интерфейс**. Используется, когда нужен **одноразовый объект** с собственной реализацией интерфейса или абстрактного класса. - Имеет доступ к членам внешнего класса и локальным переменным (только final или effectively final). - Может содержать только нестатические поля и методы. - Существует пока существует ссылка на него. - Виден только в методе, где объявлен. - Не может быть наследован.
42
Сколько объектов анонимного класса можно создать в программе?
Анонимный класс **не имеет имени** и его экземпляр создается **одновременно с объявлением**, поэтому **можно создать только один объект анонимного класса**.
43
Что такое исключения? Какие типы исключительных ситуаций бывают?
**Исключения (exceptions)** - это **механизм обработки ошибок**, который позволяет писать **надёжный и безопасный код**. Использование: * Блоки **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()**