Главная страница

ОглавлениеCore


Скачать 1.53 Mb.
НазваниеОглавлениеCore
Дата17.05.2023
Размер1.53 Mb.
Формат файлаpdf
Имя файлаpolnaya_metodichka (1).pdf
ТипДокументы
#1138113
страница8 из 25
1   ...   4   5   6   7   8   9   10   11   ...   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.
Могут ли быть конструкторы у абстрактных классов? Для чего они
нужны?
Да. Необходимы для наследников.
В абстрактном классе можно объявить и определить конструкторы. Даже если не объявили никакого конструктора, компилятор добавит в абстрактный класс конструктор по умолчанию
без аргументов. Абстрактные конструкторы будут часто использоваться для обеспечения ограничений класса или инвариантов, таких как минимальные поля, необходимые для настройки класса.
Что такое интерфейсы? Какие модификаторы по умолчанию имеют поля и
методы интерфейсов?
Интерфейс – это совокупность методов, определяющих правила взаимодействия элементов системы. Другими словами, интерфейс определяет как элементы будут
взаимодействовать между собой.
Ключевое слово interface используется для создания полностью абстрактных классов.
Основное предназначение интерфейса – определять, каким образом можно использовать класс, который его реализует. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не реализует их поведение. Все методы неявно объявляются как public.
Интерфейс также может содержать и поля. В этом случае они автоматически являются публичными public, статическими static и неизменяемыми final.
Интерфейс нужен чтобы реализовать абстрактный класс. По сути это абстрактный класс, все методы у него абстрактные.

методы интерфейса являются публичными (public) и абстрактными (abstract),
если имплементироть интерфейс, то наследующий его класс должен будет реализовать все эти абстрактные методы, в отличии от абстрактного класса;

поля – public static final;

есть дефолтный метод;

нужно обязательно прописывать static;

методы могут быть static.
После 8-й Java появились дефолтные методы – если много классов реализуют данный интерфейс и чтобы не переписывать новый метод, используется дефолтный. Т. е., чтобы избежать ромбовидное наследование, нужно переопределить этот метод. А если в одном есть дефолтный метод, а в другом нет дефолтного и нужно имплементиться от обоих, то нужно всегда переопределять дефолтный.
Чем интерфейсы отличаются от абстрактных классов? В каких случаях
следует использовать абстрактный класс, а в каких интерфейс?
1. Интерфейс описывает только поведение (методы) объекта, а вот состояний (полей) у него нет (кроме public static final), в то время как у абстрактного класса они могут быть.
2. Можно наследовать только один класс, а реализовать интерфейсов сколько угодно.
Интерфейс может наследовать (extends) другой интерфейс/интерфейсы.
3. Абстрактные классы используются, когда есть отношение «is-a», то есть класс- наследник расширяет базовый абстрактный класс, а интерфейсы могут быть
реализованы разными классами, вовсе не связанными друг с другом.
4. Абстрактный класс может реализовывать методы; интерфейс может реализовывать статические методы начиная с 8-й версии.
5. Нет конструктора у интерфейса.

В Java класс может одновременно реализовать несколько интерфейсов, но наследоваться только от одного класса.
Абстрактные классы используются только тогда, когда присутствует тип отношений «is a»
(является). Интерфейсы могут реализоваться классами, которые не связаны друг с другом.
Абстрактный класс – средство, позволяющее избежать написания повторяющегося кода,
инструмент для частичной реализации поведения.
Интерфейс – это средство выражения семантики класса, контракт, описывающий возможности. Все методы интерфейса неявно объявляются как public abstract или (начиная с
Java 8) default-методами с реализацией по умолчанию, а поля – public static final.
Интерфейсы позволяют создавать структуры типов без иерархии.
Наследуясь от абстрактного, класс «растворяет» собственную индивидуальность. Реализуя интерфейс, он расширяет собственную функциональность.
Абстрактные классы содержат частичную реализацию, которая дополняется или расширяется в подклассах. При этом все подклассы схожи между собой в части реализации,
унаследованной от абстрактного класса и отличаются лишь в части собственной реализации абстрактных методов родителя. Поэтому абстрактные классы применяются в случае построения иерархии однотипных, очень похожих друг на друга классов. В этом случае наследование от абстрактного класса, реализующего поведение объекта по умолчанию может быть полезно, так как позволяет избежать написания повторяющегося кода. Во всех остальных случаях лучше использовать интерфейсы.
Что имеет более высокий уровень абстракции – класс, абстрактный класс
или интерфейс?
Интерфейс.
Может ли один интерфейс наследоваться от другого? От двух других?
Да, может. Используется ключевое слово extends.
Что такое дефолтные методы интерфейсов? Для чего они нужны?
В JDK 8 была добавлена такая функциональность, как методы по умолчанию с модификатором default. И теперь интерфейсы могут иметь их реализацию по умолчанию,
которая используется, если класс, реализующий данный интерфейс, не реализует метод.
Это нужно для обратной совместимости.
Если один или несколько методов добавляются к интерфейсу, все реализации также будут вынуждены их реализовывать. Методы интерфейса по умолчанию являются эффективным способом решения этой проблемы.
Почему в некоторых интерфейсах вообще не определяют методов?
Это так называемые маркерные интерфейсы. Они просто указывают, что класс относится к определенному типу. Примером может послужить интерфейс Clonable, который указывает на то, что класс поддерживает механизм клонирования.
Что такое static метод интерфейса?
Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс.

Статические методы в интерфейсе являются частью интерфейса без возможности использовать их для объектов класса реализации.
Методы класса java.lang.Object нельзя переопределить как статические.
Статические методы в интерфейсе используются для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т. д.
Как вызывать static метод интерфейса?
Используя имя интерфейса:
Paper.show();
Почему нельзя объявить метод интерфейса с модификатором final?
В случае интерфейсов указание модификатора final бессмысленно, т. к. все методы интерфейсов неявно объявляются как абстрактные, т. е. их невозможно выполнить, не реализовав где-то еще, а этого нельзя будет сделать, если у метода идентификатор final.
Как решается проблема ромбовидного наследования при наследовании
интерфейсов при наличии default-методов?
Обязательным переопределением default-метода.
В случае, если вызывается default-метод из интерфейса, его обязательно надо будет переопределить.
1   ...   4   5   6   7   8   9   10   11   ...   25


написать администратору сайта