JavaCore4: OOP Flashcards

1
Q

Какие виды классов есть в java?

A
  • 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 - сущность функционального интерфейса или анонимная функция, обладающая свойствами объекта.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

В каких случаях применяются вложенные классы? (2)

A

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

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

Основные различия статических и внутренних классов?

A

1) В. имеет доступ ко всем членам внешнего к., С. только к static
2) В. привязан (и может быть инициализирован) к объекту внешнего класса, С. независим от него и может быть вызван напрямую, или с объектом: Outer.StaticInner.staticMethod(); / outerObj = Outer.StaticInner(); outerObj.staticMethod();
Т.о., если для использования внутреннего к. мы можем обойтись без объекта внешнего к. - класс д.б. static.
4) 3) В. не может иметь static полей и методов, С. может иметь и те и те, доступ к ним возможен через объект этого статического класса.

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

Основные свойства локальных классов? (5)

A

Используется если класс необходим только внутри какого-то метода и требуется
создавать экземпляры этого класса только в этом методе.

1) видны только в пределах блока, в котором объявлены;
2) не могут быть объявлены как private/public/protected или static (по этой причине
интерфейсы нельзя объявить локально);
3) не могут иметь внутри себя статических объявлений (полей, методов, классов), но
могут иметь константы (static final);
4) имеют доступ к полям и методам обрамляющего класса;
5) могут обращаться к локальным переменным и параметрам метода, если они
объявлены с модификатором final или являются effectively final.

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

Основные свойства анонимных классов? (5)

A
  • объявляется, инициализируется и используется в одном месте программы – месте его создания;
  • реализует лишь методы своего интерфейса или суперкласса, т. е. не может объявлять каких-либо новых методов, так как для доступа к ним нет
    поименованного типа.
  • применяется для создания объекта функции (function object), например, реализация интерфейса
    Comparator;
  • применяется для создания объекта процесса (process object), такого как экземпляры классов
    Thread, Runnable и подобных;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое перечисления (enum)?

A
  • Это набор логически связанных констант.
  • Все элементы под капотом инициализируются как public static final
  • Нужны для ограничения области допустимых значений: например, времена года, дни недели.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Какие методы есть у Enum?

A
  • valueOf() возвращает конкретный элемент;
  • ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0);
  • values() возвращает массив всех констант перечисления;
  • name() отличается от toString тем, что второй можно переопределить.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Особенности Enum-классов (5)

A

1) Конструктор всегда private или default. Нет public конструктора, поэтому нельзя создать экземпляр вне Enum => Легко создать потокобезопасный singleton без double check volatile переменных.
2) Могут имплементировать интерфейсы.
3) Не могут наследовать класс.
4) При equals() выполняется ==.
5) Может использоваться в TreeSet и TreeMap, т. к. имплементирует
Comparable => compareTo() имитирует порядок элементов, предоставляемый ordinal().

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

Дайте определение понятию «конструктор»

A
  • Конструктор – это специальный метод, у которого отсутствует возвращаемый тип и который
    имеет то же имя, что и класс, в котором он используется.
  • Конструктор вызывается при
    создании нового объекта класса и определяет действия, необходимые для его
    инициализации.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что такое конструктор по умолчанию? (3)

A
  • Если у какого-либо класса не определить конструктор, то компилятор сгенерирует
    конструктор без аргументов – так называемый «конструктор по умолчанию».
  • Если у класса уже определен какой-либо конструктор, то конструктор по умолчанию создан
    не будет и, если он необходим, его нужно описывать явно.
  • В классе-наследнике при отсутствии переопределенного конструктора будет использован
    конструктор родителя.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Для чего нужны приватные конструкторы?

A

Приватный конструктор запрещает создание экземпляра класса вне методов самого класса.
Нужны для реализации паттернов, например, singleton, static factory(запрещает создание через конструктор - используем метод)

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

Чем отличаются конструкторы по умолчанию, конструктор копирования и
конструктор с параметрами?

A
  • у конструктора по умолчанию отсутствуют какие-либо аргументы;
  • конструктор копирования принимает в качестве аргумента уже существующий
    объект класса для последующего создания его клона;
  • конструктор с параметрами имеет в своей сигнатуре аргументы (обычно
    необходимые для инициализации полей класса).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какие модификаторы доступа есть в Java? Какие применимы к классам?

A

private (приватный): члены класса доступны только внутри класса. Для обозначения
используется служебное слово private.
default, package-private, package level (доступ на уровне пакета): видимость класса/членов
класса только внутри пакета. Является модификатором доступа по умолчанию –
специальное обозначение не требуется.
protected (защищенный): члены класса доступны внутри пакета и в наследниках. Для
обозначения используется служебное слово protected.
public (публичный): класс/члены класса доступны всем. Для обозначения используется
служебное слово public.
Последовательность модификаторов по возрастанию уровня закрытости: public, protected,
default, private.
Во время наследования возможно изменения модификаторов доступа в сторону большей
видимости (для поддержания соответствия принципу подстановки Барбары Лисков).
Класс может быть объявлен с модификатором public и default.

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

Может ли объект получить доступ к члену класса объявленному как private?
Если да, то каким образом? (4)

A
  • внутри класса доступ к приватной переменной открыт без ограничений;
  • вложенный класс имеет полный доступ ко всем (в том числе и приватным) членам
    содержащего его класса;
  • доступ к приватным переменным извне может быть организован через отличные
    от приватных методы, которые предоставлены разработчиком класса. Например:
    getX() и setX().
  • через механизм рефлексии (Reflection API).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что означает модификатор static?

A

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

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

К каким конструкциям Java применим модификатор static? (5)

A
  • полям;
  • методам;
  • вложенным классам;
  • членам секции import;
  • блокам инициализации.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

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

A

Перегружен – да. Переопределен - нет.

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

Могут ли нестатические методы перегрузить статические?

A

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

19
Q

Как получить доступ к переопределенным методам родительского класса?

A

С помощью ключевого слова super мы можем обратиться к любому члену родительского
класса – методу или полю, если они не определены с модификатором private.
super.method();

20
Q

Можно ли сузить уровень доступа/тип возвращаемого значения при
переопределении метода?

A

При переопределении метода нельзя сузить модификатор доступа к методу (например, с
public до private), но можно расширить.
Изменить тип возвращаемого значения нельзя, но можно сузить возвращаемое
значение, если они совместимы. Например, если метод возвращает объект класса, а
переопределенный метод возвращает класс-наследник:
Ковариантность возвращаемого значения

21
Q

Можно ли
менять при переопределении менять throws?

A

Секцию throws метода можно не указывать, но стоит помнить, что она остается
действительной, если уже определена у метода родительского класса. Можно
добавлять новые исключения, являющиеся наследниками от уже объявленных или
исключения RuntimeException. Порядок следования таких элементов при переопределении
значения не имеет.

22
Q

Что означает модификатор final для разных сущностей? (7)

A
  • класс не может иметь наследников;
  • метод не может быть переопределен в классах-наследниках;
  • поле не может изменить свое значение после инициализации;
  • параметры методов не могут изменять свое значение внутри метода;
  • для локальных переменных примитивного типа это означает, что однажды
    присвоенное значение не может быть изменено;
  • для ссылочных переменных это означает, что после присвоения объекта нельзя
    изменить ссылку на данный объект (ссылку изменить нельзя, но состояние
    объекта изменять можно).
    Следует также отметить, что к abstract-классам нельзя применить модификатор final, т.
    к. это взаимоисключающие понятия.
23
Q

Где и для чего используется модификатор abstract?

A

1) классы могут выступать только предками для других классов.
2) Метод, помеченный ключевым словом abstract, – абстрактный метод, т. е. метод, который не
имеет реализации. Если в классе присутствует хотя бы один абстрактный метод, то весь
класс должен быть объявлен абстрактным
3) Использование абстрактных классов и методов позволяет описать некий шаблон объекта,
который должен быть реализован в других классах. В них же самих описывается лишь некое
общее для всех потомков поведение.
4) абстрактный метод не может быть вне абстрактного класса;

24
Q

Что такое интерфейсы?

A
  • Интерфейс – это совокупность полей и методов, определяющих правила взаимодействия
    элементов системы.
  • Основное предназначение интерфейса – определять, каким образом можно использовать
    класс, который его реализует.
25
Q

Какие модификаторы по умолчанию имеют поля и
методы интерфейсов?

A

Методы: public abstract
Поля: public static final

26
Q

Чем интерфейсы отличаются от абстрактных классов? (5)

A
  1. Интерфейс описывает только поведение (методы) объекта, а вот полей у
    него нет (кроме констант), в то время как у абстрактного класса они могут быть.
  2. Можно наследовать только один класс, а реализовать интерфейсов сколько угодно.
    Интерфейс может наследовать (extends) другой интерфейс/интерфейсы.
  3. Абстрактные классы используются, когда есть отношение «is-a», то есть класс-
    наследник расширяет базовый абстрактный класс, а интерфейсы могут быть
    реализованы разными классами, вовсе не связанными друг с другом.
  4. Абстрактный класс может реализовывать методы; интерфейс может реализовывать
    статические методы начиная с 8-й версии.
  5. Нет конструктора у интерфейса.
27
Q

Что такое static метод интерфейса? Для чего используются?

A
  • Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс.
  • Статические методы в интерфейсе используются для обеспечения вспомогательных методов, например, проверки на null, сортировки коллекций и т.д.
28
Q

instanceof VS getClass

A

instanceof
Оператор instanceof сравнивает объект и указанный тип. Его можно использовать для проверки является ли данный объект экземпляром некоторого класса, либо экземпляром его дочернего класса, либо экземпляром класса, который реализует указанный интерфейс.
this.getClass() == that.getClass() проверяет два класса на идентичность, поэтому для корректной реализации контракта метода equals() необходимо использовать точное сравнение с помощью метода getClass().

29
Q

Что такое маркерный интерфейс?

A

И. без методов: служит для маркировки класса на соответствие определенному типу (serializable)

30
Q

Что такое Блоки инициализации?

A

Код, заключенный в фигурные скобки и размещаемый внутри класса вне объявления методов или конструкторов.
Существуют статические и нестатические блоки инициализации.

31
Q

Генерят ли блоки инициализации исключения?

A

Блок инициализации способен генерировать исключения, если их объявления перечислены в throws всех конструкторов класса.

Если возникшее исключение - наследник RuntimeException:
для статических блоков инициализации будет выброшено java.lang.ExceptionInInitializerError;
для нестатических будет проброшено исключение-источник.
Если возникшее исключение - наследник Error, то в обоих случаях будет выброшено java.lang.Error. Исключение: java.lang.ThreadDeath - смерть потока. В этом случае никакое исключение выброшено не будет.

32
Q

Для чего в Java используются статические блоки инициализации?

A

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

33
Q

Порядок вызова конструкторов и блоков инициализации с учётом иерархии классов.

A

Parent static block → Child static block → Grandchild static block
→ Parent non-static block →
Parent constructor →
→ Child non-static block→ Child constructor →
→ Grandchild non-static block → Grandchild constructor

34
Q

Что такое класс Object?

A

Базовый класс для всех остальных объектов в Java. Любой класс наследуется от Object и, соответственно, наследуют его методы

Все классы являются наследниками суперкласса Object. Это не нужно указывать явно. В результате объект Object может ссылаться на объект любого другого класса.

35
Q

Какие методы есть у класса Object (перечислить все)? Что они делают?

A
  • equals() - проверка на равенство двух обьектов
  • hashCode() - изначально случайно число int
  • toString() - представления данного объекта в виде строки.
  • getClass() - получение типа данного обьекта
  • clone() - клонирует объект методом.
  • finalize() - deprecated, вызывается GC перед удалением. (нет гарантии что будет вызван)

для многопоточки:
- notify() - «размораживает» одну случайную нить
- notifyAll() - «размораживает» все нити данного монитора
- wait() - нить освобождает монитор и «становится на паузу»

36
Q

Что такое hash-code?

A
  • Хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.
  • Он реализован таким образом, что для одного и того же входного объекта, хеш-код всегда будет одинаковым.
37
Q

Для чего нужен метод hashCode()?

A

вычисляет целочисленное значение для конкретного элемента класса, чтобы использовать его для быстрого поиска и доступа к этому элементу в hash-структурах данных, например, HashMap, HashSet и прочих.

38
Q

Пересчитывается ли hash-code для объекта автоматически при изменении его состояния?

A

Нет. JVM пересчитывает hashcode объекта только когда это требуется:
- когда О. становится ключом для хэш-структуры, поэтому map.contains(key) вернет false, если состояние объекта изменилось после добавления в мапу.

39
Q

Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode()?

A

Выбирать поля, которые с большой долью вероятности будут различаться:
Для этого необходимо использовать уникальные, лучше всего примитивные поля, например такие как id, uuid.
При этом нужно следовать правилу, если поля задействованы при вычислении hashCode(), то они должны быть задействованы и при выполнении equals().

40
Q

Что такое метод equals()?

A

Equals - это метод, определенный в Object, который служит для сравнения объектов.
equals в Object сравнивает по “==”

41
Q

Свойства equals()? (6)

A
  • Симметричность: если a.equals(b) то b.equals(a)
  • Рефлексивность: x.equals(x)
    должно возвращать true.
  • Постоянство: повторный вызов метода equals() должен возвращать одно и тоже значение до тех пор, пока какое-либо значение свойств объекта не будет изменено.
  • Транзитивность: Если a.equals(b) и b.equals(c), то тогда a.equals(c)
  • Совместимость с hashCode(): Два тождественно равных объекта должны иметь одно и то же значение hashCode()
  • a.equals(null) -> false
42
Q

Какой контракт между hashCode() и equals()?

A

1) Если два объекта возвращают разные значения hashcode(), то они не могут быть равны
2) Если equals объектов true, то и хэшкоды должны быть равны, при этом наоборот не всегда (коллизия).
3) Переопределив equals, всегда переопределять и hashcode.

43
Q

Что будет, если переопределить equals() не переопределяя hashCode()?

A

Нарушится контракт -> hash-code будет вычисляться как у предка, и равные по equals() будут помещены в разные ячейки hashmap.

44
Q

Какие поля использовать при переопределении hashcode?

A
  • Те же, что и в equals()
  • Желательно уникальные для объекта поля, не подверженные изменению.