Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции 2025. Java. Белая / Ответы на билеты. Java

.pdf
Скачиваний:
0
Добавлен:
02.01.2026
Размер:
4.52 Mб
Скачать

Когда не нужны геттеры/сеттеры (или нужны выборочно):

Неизменяемые (Immutable) классы: Если объект спроектирован так, что его состояние не может меняться после создания (например, ), то сеттеры для его полей не нужны. Поля инициализируются в конструкторе и доступны только через геттеры (или вообще не доступны, если это внутренняя деталь).

Поля "только для чтения" извне: Если значение поля должно устанавливаться только при создании объекта (в конструкторе) и затем только читаться, нужен только геттер.

Поля "только для записи" извне (редко): Если значение поля можно только установить, но не прочитать извне (например, пароль, который только устанавливается и используется для хеширования внутри), то нужен только сеттер. Внутренние поля класса: Если поле используется исключительно внутри класса и не является частью его публичного интерфейса, геттеры/сеттеры могут быть не нужны или могут быть / .

Многие IDE (например, IntelliJ IDEA, Eclipse) предоставляют инструменты для автоматической генерации геттеров и сеттеров для полей класса.

41. Может ли быть поле данных класса объявлено как с модификатором static и final одновременно и что это означает?

Да, поле данных класса может быть объявлено с модификаторами и одновременно. Такое поле называется константой класса или статической

константой.

Объявление:

Что это означает:

1. :

Принадлежность классу: Поле принадлежит самому классу, а не какомулибо конкретному экземпляру (объекту) этого класса.

Единственная копия: Существует только одна копия этого поля в памяти, независимо от того, сколько (или ни одного) объектов класса создано. Все экземпляры класса (если они есть) будут иметь доступ к этому одному и тому же значению.

Доступ через имя класса: Доступ к полю осуществляется через имя класса: (например, ).

2. :

Неизменяемость значения (для примитивов): Если поле примитивного типа (, , и т.д.), его значение не может быть изменено после инициализации. Оно становится истинной константой.

Неизменяемость ссылки (для ссылочных типов): Если поле ссылочного типа (например, , массив, другой объект), то означает, что ссылка на объект не может быть изменена (т.е. поле не может указывать на другой объект после инициализации). Однако,

состояние самого объекта, на который указывает ссылка, может быть изменено, если объект сам по себе изменяемый (mutable).

Чтобы создать полностью неизменяемую константу для ссылочного типа, нужно, чтобы сам объект был неизменяемым (например, , , или пользовательский неизменяемый класс), или использовать коллекции из и т.п.

3. Инициализация:

поле должно быть инициализировано один раз:

Либо при объявлении:

Либо в статическом блоке инициализации:

После инициализации значение (или ссылка) не может быть изменено.

Соглашение об именовании:

По общепринятому соглашению в Java, имена констант (особенно если они ) пишутся в

ВЕРХНЕМРЕГИСТРЕС_ПОДЧЕРКИВАНИЯМИ (SNAKE_CASE). Например, , .

Преимущества использования полей (констант):

Читаемость: Использование именованных констант вместо "магических чисел" или строк делает код более понятным и легким для сопровождения. лучше, чем .

Централизация: Значения констант определены в одном месте. Если нужно изменить значение, это делается только в одном месте, и изменение отразится везде, где константа используется.

Безопасность типов: Компилятор проверяет типы при использовании констант.

Производительность: Компилятор Java может выполнять оптимизации с константами, например, встраивать (inline) их значения непосредственно в код на этапе компиляции (для compile-time constants).

В итоге, поле — это переменная, которая принадлежит классу (а не экземпляру), имеет только одну копию, и ее значение (или ссылка для объектов) не может быть изменено после инициализации. Это стандартный способ определения констант в Java.

42. Методы класса конструкторы, синтаксис и назначение

Конструкторы — это специальные методы в классе, которые используются для

инициализации вновь создаваемых объектов этого класса. Они вызываются автоматически при использовании оператора .

Назначение конструкторов:

1.Инициализация состояния объекта: Основная задача конструктора — установить начальные значения для полей (переменных экземпляра) нового объекта. Это может быть присвоение значений по умолчанию или значений, переданных в качестве аргументов.

2.Выполнение подготовительных действий: Конструктор может выполнять любые другие действия, необходимые для того, чтобы объект был готов к использованию сразу после создания (например, открытие ресурсов, регистрация в системе и т.д.).

3.Гарантия корректного состояния объекта: Конструкторы помогают обеспечить, что объект создается в согласованном и валидном состоянии.

Синтаксис объявления конструктора:

Ключевые особенности синтаксиса:

1.Имя конструктора всегда совпадает с именем класса. Это обязательно.

2.Конструкторы не имеют типа возвращаемого значения, даже . Если указать тип возвращаемого значения, компилятор будет считать это обычным методом, а не конструктором.

3. (необязательно): Могут быть , ,

или package-private (default). Модификатор доступа определяет, откуда можно создавать экземпляры этого класса.

конструктор используется, например, в паттерне Singleton или для утилитарных классов, которые не должны иметь экземпляров.

4. (необязательно): Как и обычные методы, конструкторы могут принимать параметры для инициализации полей объекта.

5. (необязательно): Конструктор может объявлять проверяемые исключения, которые он может выбросить.

6.Тело конструктора : Содержит инструкции для инициализации.

7.Вызов конструктора суперкласса (): Если класс наследуется от другого класса, первая инструкция в конструкторе подкласса (явная или неявная) — это вызов конструктора суперкласса.

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

8.Вызов другого конструктора того же класса (): Конструктор может вызывать другой конструктор того же класса с помощью . Если используется, должен быть первой инструкцией в конструкторе.

Нельзя одновременно использовать и явно в одном конструкторе.

Примеры:

1. Конструктор без параметров (No-Arg Constructor):

2. Конструктор с параметрами (Parameterized Constructor):

3. Конструктор по умолчанию (Default Constructor):

Если в классе не определено ни одного конструктора явно, компилятор

Java автоматически предоставляет публичный конструктор без параметров. Этот конструктор называется конструктором по умолчанию.

Он просто вызывает конструктор суперкласса без аргументов (). Если вы определяете хотя бы один конструктор (любой, с параметрами или без), конструктор по умолчанию больше не предоставляется автоматически. Если он вам нужен, вы должны объявить его явно.

Ключевые моменты о конструкторах:

Не наследуются. Каждый класс должен определить свои собственные конструкторы (или полагаться на конструктор по умолчанию).

Не могут быть , или . (Хотя класс, содержащий конструктор, может быть или ).

Вызываются только один раз при создании объекта с помощью . Их нельзя вызвать как обычный метод на уже существующем объекте.

Конструкторы являются неотъемлемой частью процесса создания объектов, обеспечивая их правильную и предсказуемую инициализацию.

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

Да, класс может иметь в своем составе несколько конструкторов. Это называется перегрузкой конструкторов (constructor overloading).

Условия для перегрузки конструкторов:

Чтобы конструкторы были перегружены (а не считались дубликатами), они должны

различаться своими списками параметров. Различия могут быть в: 1. Количестве параметров:

2. Типах параметров (при одинаковом количестве):

3. Порядке типов параметров (при одинаковом количестве и наборе типов):

Зачем нужна перегрузка конструкторов?

Гибкость при создании объектов: Предоставляет различные способы создания и инициализации объектов в зависимости от доступной информации или требуемого начального состояния.

Удобство использования: Позволяет пользователям класса выбирать наиболее подходящий конструктор.

Инициализация полей по умолчанию: Один конструктор может устанавливать значения по умолчанию, а другой принимать все значения от пользователя.

Уменьшение дублирования кода (с использованием ): Один конструктор может вызывать другой конструктор того же класса (chaining constructors), передавая ему значения по умолчанию или преобразуя параметры.

Вызов конструктора из другого конструктора ():

Часто при перегрузке конструкторов один из них является "основным" (наиболее

полным), а другие вызывают его с некоторыми значениями по умолчанию. Это делается с помощью .

Вызов должен быть первой инструкцией в теле вызывающего конструктора.