JavaCore4: OOP Flashcards
Какие виды классов есть в java?
- Top level class (обычный класс):
◦ Concrete class (обычный класс);
◦ Abstract class (абстрактный класс);
◦ Final class (финализированный класс). - Interfaces (интерфейс) - содержит набор абстрактных методов, подлежащих реализации в имплементирующих его обычных классах
- Enum (перечисление) - специальный тип К., представляющий ограниченный проименованный набор значений.
- Nested class (вложенный класс):
◦ Static nested class (статический вложенный класс): ассоциирован с внешним К., но не с его объектом;
◦ Member inner class (простой внутренний класс): ассоциирован с объектом внешнего класса;
◦ Local inner class (локальный класс): создается внутри метода и не доступен за его пределами.;
◦ Anonymous inner class (анонимный класс): безымянный класс, созданный и инстанциированный в одном выражении. - Lambda expression - сущность функционального интерфейса или анонимная функция, обладающая свойствами объекта.
В каких случаях применяются вложенные классы? (2)
1) Он должен создаваться только для того, чтобы обслуживать обрамляющий
его класс.
2) Если вложенный класс оказывается полезен в каком-либо ином контексте, он
должен стать классом верхнего уровня.
Основные различия статических и внутренних классов?
1) В. имеет доступ ко всем членам внешнего к., С. только к static
2) В. привязан (и может быть инициализирован) к объекту внешнего класса, С. независим от него и может быть вызван напрямую, или с объектом: Outer.StaticInner.staticMethod(); / outerObj = Outer.StaticInner(); outerObj.staticMethod();
Т.о., если для использования внутреннего к. мы можем обойтись без объекта внешнего к. - класс д.б. static.
4) 3) В. не может иметь static полей и методов, С. может иметь и те и те, доступ к ним возможен через объект этого статического класса.
Основные свойства локальных классов? (5)
Используется если класс необходим только внутри какого-то метода и требуется
создавать экземпляры этого класса только в этом методе.
1) видны только в пределах блока, в котором объявлены;
2) не могут быть объявлены как private/public/protected или static (по этой причине
интерфейсы нельзя объявить локально);
3) не могут иметь внутри себя статических объявлений (полей, методов, классов), но
могут иметь константы (static final);
4) имеют доступ к полям и методам обрамляющего класса;
5) могут обращаться к локальным переменным и параметрам метода, если они
объявлены с модификатором final или являются effectively final.
Основные свойства анонимных классов? (5)
- объявляется, инициализируется и используется в одном месте программы – месте его создания;
- реализует лишь методы своего интерфейса или суперкласса, т. е. не может объявлять каких-либо новых методов, так как для доступа к ним нет
поименованного типа. - применяется для создания объекта функции (function object), например, реализация интерфейса
Comparator; - применяется для создания объекта процесса (process object), такого как экземпляры классов
Thread, Runnable и подобных;
Что такое перечисления (enum)?
- Это набор логически связанных констант.
- Все элементы под капотом инициализируются как public static final
- Нужны для ограничения области допустимых значений: например, времена года, дни недели.
Какие методы есть у Enum?
- valueOf() возвращает конкретный элемент;
- ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0);
- values() возвращает массив всех констант перечисления;
- name() отличается от toString тем, что второй можно переопределить.
Особенности Enum-классов (5)
1) Конструктор всегда private или default. Нет public конструктора, поэтому нельзя создать экземпляр вне Enum => Легко создать потокобезопасный singleton без double check volatile переменных.
2) Могут имплементировать интерфейсы.
3) Не могут наследовать класс.
4) При equals() выполняется ==.
5) Может использоваться в TreeSet и TreeMap, т. к. имплементирует
Comparable => compareTo() имитирует порядок элементов, предоставляемый ordinal().
Дайте определение понятию «конструктор»
- Конструктор – это специальный метод, у которого отсутствует возвращаемый тип и который
имеет то же имя, что и класс, в котором он используется. - Конструктор вызывается при
создании нового объекта класса и определяет действия, необходимые для его
инициализации.
Что такое конструктор по умолчанию? (3)
- Если у какого-либо класса не определить конструктор, то компилятор сгенерирует
конструктор без аргументов – так называемый «конструктор по умолчанию». - Если у класса уже определен какой-либо конструктор, то конструктор по умолчанию создан
не будет и, если он необходим, его нужно описывать явно. - В классе-наследнике при отсутствии переопределенного конструктора будет использован
конструктор родителя.
Для чего нужны приватные конструкторы?
Приватный конструктор запрещает создание экземпляра класса вне методов самого класса.
Нужны для реализации паттернов, например, singleton, static factory(запрещает создание через конструктор - используем метод)
Чем отличаются конструкторы по умолчанию, конструктор копирования и
конструктор с параметрами?
- у конструктора по умолчанию отсутствуют какие-либо аргументы;
- конструктор копирования принимает в качестве аргумента уже существующий
объект класса для последующего создания его клона; - конструктор с параметрами имеет в своей сигнатуре аргументы (обычно
необходимые для инициализации полей класса).
Какие модификаторы доступа есть в Java? Какие применимы к классам?
private (приватный): члены класса доступны только внутри класса. Для обозначения
используется служебное слово private.
default, package-private, package level (доступ на уровне пакета): видимость класса/членов
класса только внутри пакета. Является модификатором доступа по умолчанию –
специальное обозначение не требуется.
protected (защищенный): члены класса доступны внутри пакета и в наследниках. Для
обозначения используется служебное слово protected.
public (публичный): класс/члены класса доступны всем. Для обозначения используется
служебное слово public.
Последовательность модификаторов по возрастанию уровня закрытости: public, protected,
default, private.
Во время наследования возможно изменения модификаторов доступа в сторону большей
видимости (для поддержания соответствия принципу подстановки Барбары Лисков).
Класс может быть объявлен с модификатором public и default.
Может ли объект получить доступ к члену класса объявленному как private?
Если да, то каким образом? (4)
- внутри класса доступ к приватной переменной открыт без ограничений;
- вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам
содержащего его класса; - доступ к приватным переменным извне может быть организован через отличные
от приватных методы, которые предоставлены разработчиком класса. Например:
getX() и setX(). - через механизм рефлексии (Reflection API).
Что означает модификатор static?
Статическая переменная – это переменная, принадлежащая классу, а не объекту.
Статический класс – это вложенный класс, который может обращаться только к
статическим полям обертывающего его класса.
Внутри статического метода нельзя вызвать нестатический
К каким конструкциям Java применим модификатор static? (5)
- полям;
- методам;
- вложенным классам;
- членам секции import;
- блокам инициализации.
Может ли статический метод быть переопределен или перегружен?
Перегружен – да. Переопределен - нет.