ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 01.12.2023
Просмотров: 474
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Дайте определение понятию «конструктор»
Конструктор – это специальный метод, у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия, необходимые для его инициализации.
Что такое конструктор по умолчанию?
Если у какого-либо класса не определить конструктор, то компилятор сгенерирует конструктор без аргументов – так называемый «конструктор по умолчанию».
Если у класса уже определен какой-либо конструктор, то конструктор по умолчанию создан не будет и, если он необходим, его нужно описывать явно.
В классе-наследнике при отсутствии переопределенного конструктора будет использован конструктор родителя.
Могут ли быть приватные конструкторы? Для чего они нужны?
Да, могут. Приватный конструктор запрещает создание экземпляра класса вне методов
самого класса.
Финальные нет.
Нужен для реализации паттернов, например, singleton.
Приватный конструктор запрещает вызывать конструктор другим классам извне.
У абстрактного класса есть приватный конструктор (абстрактный класс позволяет описать некоторое состояние объекта).
1 2 3 4 5 6 7 8 9 10 ... 25
Расскажите про классы-загрузчики и про динамическую загрузку классов
При запуске JVM для загрузки приложения используются следующие загрузчики классов:
•
Bootstrap ClassLoader – главный загрузчик (загружает платформенные классы
JDK из архива rt.jar);
•
AppClassLoader – системный загрузчик (загружает классы приложения текущего,
определенные в CLASSPATH);
•
SystemClassLoader загружает классы приложения, определенные в CLASSPATH;
•
Extension ClassLoader – загрузчик расширений загружает все необходимые библиотеки из директории java.home (загружает классы расширений из javahome,
которые по умолчанию находятся в каталоге jre/lib/ext).
Исключение – ClassNotFoundExtension.
Динамическая загрузка происходит «на лету» в ходе выполнения программы с помощью статического метода класса Class.forName (имя класса). Для чего нужна динамическая загрузка? Например, не знаем, какой класс понадобится и принимаем решение в ходе выполнения программы, передавая имя класса в статический метод forName().
Чем отличаются конструкторы по умолчанию, конструктор копирования и
конструктор с параметрами?
•
у конструктора по умолчанию отсутствуют какие-либо аргументы;
•
конструктор копирования принимает в качестве аргумента уже существующий объект класса для последующего создания его клона;
•
конструктор с параметрами имеет в своей сигнатуре аргументы (обычно необходимые для инициализации полей класса).
Какие модификаторы доступа есть в Java? Какие применимы к классам?
private (приватный): члены класса доступны только внутри класса. Для обозначения используется служебное слово private.
default, package-private, package level (доступ на уровне пакета): видимость класса/членов класса только внутри пакета. Является модификатором доступа по умолчанию –
специальное обозначение не требуется.
protected (защищенный): члены класса доступны внутри пакета и в наследниках. Для обозначения используется служебное слово protected.
public (публичный): класс/члены класса доступны всем. Для обозначения используется служебное слово public.
Последовательность модификаторов по возрастанию уровня закрытости: public, protected,
default, private.
Во время наследования возможно изменения модификаторов доступа в сторону большей видимости (для поддержания соответствия принципу подстановки Барбары Лисков).
Класс может быть объявлен с модификатором public и default.
Может ли объект получить доступ к члену класса объявленному как private?
Если да, то каким образом?
•
внутри класса доступ к приватной переменной открыт без ограничений;
•
вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам содержащего его класса;
•
доступ к приватным переменным извне может быть организован через отличные от приватных методы, которые предоставлены разработчиком класса. Например:
getX() и setX().
•
через механизм рефлексии (Reflection API).
Что означает модификатор static?
Статическая переменная – это переменная, принадлежащая классу, а не объекту.
Статический класс – это вложенный класс, который может обращаться только к статическим полям обертывающего его класса.
Внутри статического метода нельзя вызвать нестатический метод по имени класса.Можно обратиться к статическому методу через экземпляр класса.
К каким конструкциям Java применим модификатор static?
•
полям;
•
методам;
•
вложенным классам;
•
членам секции import;
•
блокам инициализации.
В чем разница между членом экземпляра класса и статическим членом
класса?
Модификатор static говорит о том, что данный метод или поле принадлежат самому классу и доступ к ним возможен даже без создания экземпляра класса. Поля, помеченные static,
инициализируются при инициализации класса.
На методы, объявленные как static, накладывается ряд ограничений:
•
могут вызывать только другие статические методы;
•
должны осуществлять доступ только к статическим переменным;
•
не могут ссылаться на члены типа this или super.
В отличие от статических поля экземпляра класса принадлежат конкретному объекту и могут иметь разные значения для каждого. Вызов метода экземпляра возможен только после предварительного создания объекта класса.
Может ли статический метод быть переопределен или перегружен?
Перегружен – да. Все работает точно так же, как и с обычными методами – 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределен – нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
Могут ли нестатические методы перегрузить статические?
Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Как получить доступ к переопределенным методам родительского класса?
С помощью ключевого слова super мы можем обратиться к любому члену родительского класса – методу или полю, если они не определены с модификатором private.
super.method();
Можно ли сузить уровень доступа/тип возвращаемого значения при
переопределении метода?
При переопределении метода нельзя сузить модификатор доступа к методу (например, с public до private), но можно расширить.
Изменить тип возвращаемого значения нельзя, но можно сузить возвращаемое значение, если они совместимы. Например, если метод возвращает объект класса, а переопределенный метод возвращает класс-наследник.
Что можно изменить в сигнатуре метода при переопределении? Можно ли
менять модификаторы (throws и т. п.)?
При переопределении метода сужать модификатор доступа не разрешается, т. к. это приведет к нарушению принципа подстановки Барбары Лисков. Расширение уровня доступа возможно.
Можно изменять все, что не мешает компилятору понять, какой метод родительского класса имеется в виду:
Поэтому в сигнатуре (имя + параметры) менять ничего нельзя, но возможно расширение
уровня доступа.
Изменять тип возвращаемого значения при переопределении метода разрешено только в
сторону сужения типа (вместо родительского класса-наследника).
Секцию throws метода можно не указывать, но стоит помнить, что она остается
действительной, если уже определена у метода родительского класса. Можно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет.
Могут ли классы быть статическими?
Класс можно объявить статическим за исключением классов верхнего уровня.
Такие классы известны как «вложенные статические классы» (nested static class).
Что означает модификатор final? К чему он может быть применим?
Модификатор final может применяться к переменным, параметрам методов, полям и методам класса или самим классам.
•
класс не может иметь наследников;
•
метод не может быть переопределен в классах-наследниках;
•
поле не может изменить свое значение после инициализации;
•
параметры методов не могут изменять свое значение внутри метода;
•
для локальных переменных примитивного типа это означает, что однажды
присвоенное значение не может быть изменено;
•
для ссылочных переменных это означает, что после присвоения объекта нельзя изменить ссылку на данный объект (ссылку изменить нельзя, но состояние
объекта изменять можно).
Следует также отметить, что к abstract-классам нельзя применить модификатор final, т.
к. это взаимоисключающие понятия.
Что такое абстрактные классы? Чем они отличаются от обычных?
Это обычный класс, но с абстрактными методами.
Особенности абстрактных классов:
•
может быть конструктор (удобен для паттерна декоратор, для вызовов по цепочке из наследников);
•
может содержать абстрактные методы и обычные методы;
•
может создать приватный конструктор, но нужен тогда еще один, чтобы можно было его ексдендить;
•
имплементят интерфейсы, но не обязаны реализовывать их методы;
•
не может быть final, так как наследниками абстрактного класса могут быть другие абстрактные классы;
•
могут быть статические методы (т. к. помимо наследования и переопределения абстрактный класс может использоваться без наследования);
•
нельзя создать объект или экземпляр абстрактного класса;
•
абстрактные методы могут отсутствовать;
•
меняет хотя бы один абстрактный метод;
•
абстрактный метод не может быть вне абстрактного класса;
•
может содержать метод main().
Например, если много разных абстрактных классов и нужно подсчитать их, то для этого можно использовать статический метод для инкрементации (подсчет всех методов).
Где и для чего используется модификатор abstract?
Класс, помеченный модификатором abstract, называется абстрактным классом. Такие классы могут выступать только предками для других классов. Создавать экземпляры самого абстрактного класса не разрешается. При этом наследниками абстрактного класса могут быть как другие абстрактные классы, так и классы, допускающие создание объектов.
Метод, помеченный ключевым словом abstract, – абстрактный метод, т. е. метод, который не имеет реализации. Если в классе присутствует хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.
Использование абстрактных классов и методов позволяет описать некий шаблон объекта,
который должен быть реализован в других классах. В них же самих описывается лишь некое общее для всех потомков поведение.
Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and
‘static’". Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
Может ли быть абстрактный класс без абстрактных методов?
Класс может быть абстрактным без единого абстрактного метода, если у него указан модификатор abstract.
Могут ли быть конструкторы у абстрактных классов? Для чего они
нужны?
Да. Необходимы для наследников.
В абстрактном классе можно объявить и определить конструкторы. Даже если не объявили никакого конструктора, компилятор добавит в абстрактный класс конструктор по умолчанию