java Flashcards

1
Q

Зачем нужен оператор instanceof?

A

Оператор instanceof возвращает true, если объект является экземпляром класса или его потомком.

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

Зачем нужны и какие бывают блоки инициализации?

A

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

Бывают статические и нестатические блоки инициализации. Также возможно создать такой блок в анонимном классе.

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

Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?

A

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

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

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

A

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

Абстрактный метод — метод, который не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.
Использование абстрактных классов и методов позволяет описать некую абстракцию, которая должна быть реализована в других классах. Например, мы можем создать абстрактный класс Fighter и объявить в нём абстрактный метод fight(). Т.к. стилей борьбы может быть много, то, например, для JudoFighter extends Fighter метод fight() будет описывать приемы в стиле дзюдо и т.д.

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

Можно ли объявить метод абстрактным и статическим одновременно?

A

Нет. Получите: Illegal combination of modifiers: ‘abstract’ and ‘static’. Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.

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

Что означает ключевое слово static?

A

Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу. Т.е. доступ можно будет получить и не создавая объекта класса. Поля помеченные static инициализируются при инициализации класса. К примеру, Class.forName(«MyClass», true, currentClassLoader), где второй параметр указывает на необходимость проведения инициализации.

На методы, объявленные как static, накладывается ряд ограничений.

Они могут вызывать только другие статические методы.
Они должны осуществлять доступ только к статическим переменным.
Они не могут ссылаться на члены типа this или super.

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

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

A

К методу.
К внутреннему классу.
К полю.
К импортируемым классам (с 5-ой java). Например, import static org.junit.Assert.assertThat;

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

Что будет, если в static блоке кода возникнет исключительная ситуация?

A

Если в явном виде написать любое исключение в static-блоке, то компилятор не скомпилирует исходники. Это все от того, что компилятор умный. В остальном, взаимодействие с исключениями такое же как и в любом другом месте. Если unchecked исключение вывалится в static-блоке, то класс не будет инициализирован.
Какое исключение выбрасывается при ошибке в блоке инициализации?

Для static:

java.lang.ExceptionInInitializerError — если исключение наследуется от RuntimeException.
Для init:

exception, который и вызвал исключение, если он наследуется от RuntimeException.
Верно для static и init:

java.lang.Error — если исключение вызвано Error.
java.lang.ThreadDeath — смерть потока. Ничего не вываливается.

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

Можно ли перегрузить static метод?

A

Перегрузить можно, но переопределить нельзя.

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

Что такое статический класс, какие особенности его использования?

A

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

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

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

Какие особенности инициализации final static переменных?

A

Переменные должны быть инициализированы во время объявления или в static блоке.

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

Как влияет модификатор static на класс/метод/поле?

A

Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу.

Внутри static метода нельзя вызвать не статический метод по имени класса.

Про static класс смотрите ответ выше.

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

О чем говорит ключевое слово final?

A

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

Для класса. Класс помеченный при помощи final не может иметь наследников.
Для метода. Метод помеченный при помощи final не может быть переопределен в классах наследниках.
Для поля. Поле помеченное при помощи слова final не может изменить свое значение после инициализации (инициализируется либо при описании, либо в конструкторе, статическом или динамическом блоке).
Значение локальных переменных, а так же параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.

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

Дайте определение понятию “интерфейс”.

A

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

Наличие слова interface означает, что именно так должны выглядеть все классы, которые реализуют данный интерфейс. Таким образом, любой код, использующий конкретный интерфейс, знает только то, какие методы вызываются для этого интерфейса, но не более того.

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

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

A

Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public.

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

Почему нельзя объявить метод интерфейса с модификатором final или static?

A

Вообще с 8й версии можно static, но нужно чтобы было тело метода. final модификатор просто бессмысленный. Все методы по умолчанию абстрактные, т.е. их невозможно создать не реализовав где-то еще, но это нельзя будет сделать, если у метода идентификатор final.

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

Какие особенности создания вложенных классов: простых и статических.

A

Обычные классы (Top level classes)
Интерфейсы (Interfaces)
Перечисления (Enum)
Статические вложенные классы (Static nested classes)
Есть возможность обращения к внутренним статическим полям и методам класса обертки.
Внутренние статические классы могут содержать только статические методы.
Внутренние классы-члены (Member inner classes)
Есть возможность обращения к внутренним полям и методам класса обертки.
Не может иметь статических объявлений.
Нельзя объявить таким образом интерфейс. А если его объявить без идентификатора static, то он автоматически будет добавлен.
Внутри такого класса нельзя объявить перечисления.
Если нужно явно получить this внешнего класса — OuterClass.this
Локальный класс (Local inner classes)
Видны только в пределах блока, в котором объявлены.
Не могут быть объявлены как private/public/protected или static (по этой причине интерфейсы нельзя объявить локально).
Не могут иметь внутри себя статических объявлений (полей, методов, классов).
Имеют доступ к полям и методам обрамляющего класса.
Можно обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором final.
Анонимные классы (Anonymous inner classes)
Локальный класс без имени.

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

В чем разница вложенных и внутренних классов?

A

Вложенный класс — это класс, который объявлен внутри объявления другого класса. Вложенные классы делятся на статические и нестатические (non-static). Собственно нестатические вложенные классы имеют и другое название — внутренние классы (inner classes).

Внутренние классы в Java делятся на такие три вида:

внутренние классы-члены (member inner classes);
локальные классы (local classes);
анонимные классы (anonymous classes).
Внутренние классы-члены ассоциируются не с самим внешним классом, а с его экземпляром. При этом они имеют доступ ко всем его полям и методам.

Локальные классы (local classes) определяются в блоке Java кода. На практике чаще всего объявление происходит в методе некоторого другого класса. Хотя объявлять локальный класс можно внутри статических и нестатических блоков инициализации.

Анонимный класс (anonymous class) — это локальный класс без имени.

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

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

Каким образом из вложенного класса получить доступ к полю внешнего класса?

A

Если вложенный класс не статический и поле не статическое, то можно просто обратиться к этому полю из внутреннего класса, если только у внутреннего класса не существует поля с таким же литералом, в этом случае нужно обращаться через ссылку на внешний класс так — OuterClass.this.имяПоля

*Из комментария к статье: достаточно, чтобы класс был не статическим, а поле статическое или нет — значения не имеет для Member Inner Class.

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

Абстракция

A

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

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

Инкапсуляция

A

свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Для Java корректно будет говорить, что инкапсуляция это «сокрытие реализации». Пример из жизни — пульт от телевизора. Мы нажимаем кнопочку «увеличить громкость» и она увеличивается, но в этот момент происходят десятки процессов, которые скрыты от нас. Для Java: можно создать класс с 10 методами, например вычисляющие площадь сложной фигуры, но сделать из них 9 private. 10й метод будет называться «вычислитьПлощадь()» и объявлен public, а в нем уже будут вызываться необходимые скрытые от пользователя методы. Именно его и будет вызывать пользователь.

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

Наследование

A

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

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

Полиморфизм

A

свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.Есть общий интерфейс «Фигура» и две его реализации «Треугольник» и «Круг». У каждого есть метод «нарисовать». Благодаря полиморфизму нам нет нужды писать отдельный метод для каждой из множества фигур, чтобы вызвать метод «нарисовать». Вызов полиморфного метода позволяет одному типу выразить свое отличие от другого, сходного типа, хотя они и происходят от одного базового типа. Это отличие выражается различным действием методов, вызываемых через базовый класс (или интерфейс).
Здесь приведен пример полиморфизма (также называемый динамическим связыванием, или поздним связыванием, или связыванием во время выполнения), в котором продемонстрировано как во время выполнения программы будет выполнен тот метод, который принадлежит передаваемому объекту.

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

Дайте определение понятию “класс”

A

Класс – это шаблон, описывающий общие свойства группы объектов. Этими свойствами могут быть как характеристики объектов (размер, вес, цвет и т.п.), так и поведения, роли и т.п.

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

Что такое поле/атрибут класса?

A

Поле (атрибут) класса — это характеристика объекта. Например для фигуры это может быть название, площадь, периметр.

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

Как правильно организовать доступ к полям класса?

A

Модификатор доступа — private. Доступ через методы get\set.

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

Дайте определение понятию “конструктор”.

A

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

28
Q

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

A

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

29
Q

private

A

доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к private-членам.

30
Q

default, package, friendly, доступ по умолчанию, когда никакой модификатор не присутствует

A

член класса считается открытым внутри своего собственного пакета, но не доступен для кода, расположенного вне этого пакета.Т.е. если package2.Class2 extends package1.MainClass, то в Class2 методы без идентификатора из MainClass видны не будут.

31
Q

protected (защищённый)

A

доступ в пределах пакета и классов наследников. Доступ в классе из другого пакета будет к методам public и protected главного класса. Т.е. если package2.Class2 extends package1.MainClass, то внутри package2.Class2 методы с идентификатором protected из MainClass будут видны.

32
Q

public (открытый)

A

доступ для всех из любого другого кода проекта

33
Q

Расскажите об особенностях класса с единственным закрытым (private) конструктором.

A

Невозможно создать объект класса у которого единственный private конструктор за пределами класса. Поэтому нельзя унаследоваться от такого класса. При попытке унаследоваться будет выдаваться ошибка: There is no default constructor available in имяКласса. А при попытке создать объект этого класса: ИмяКласса() has private access in ИмяКласса

34
Q

О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?

A

super — используется для обращения к базовому классу, а this к текущему. Если написать super(), то будет вызван конструктор базового класса, а если this(), то конструктор текущего класса. Это можно использовать, например, при вызове конструктора с параметрами:

35
Q

Дайте определение понятию “метод”.

A

Метод — это последовательность команд, которые вызываются по определенному имени. Можно сказать что это функция и процедура (в случае void метода).

36
Q

Что такое сигнатура метода?

A

Сигнатура метода в Java — это имя метода плюс параметры (причем порядок параметров имеет значение).
В сигнатуру метода не входит возвращаемое значение, бросаемые им исключения, а также модификаторы.

Ключевые слова public, protected, private, abstract, static, final, synchronized, native, strictfp в т.ч. аннотации для метода — это модификаторы и не являются частью сигнатуры.

37
Q

Какие методы называются перегруженными?

A

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

38
Q

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

A

Да. Это будут просто два разных метода для программы. Статический будет доступен по имени класса.

39
Q

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

A

Метод в классе-наследнике, совпадающий по сигнатуре с методом из родительского класса называется переопределенным методом. Переопределить базовый статический метод нельзя: Instance method имяМетода in классНаследник cannot override method имяМетода in родительскийКласс

40
Q

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

A

Да. Запись имеет вид method(type … val). Например public void method(String … strings), где strings это массив, т.е. можно записать

41
Q

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

A

При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass). Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type. Но можно сузить возвращаемое значение, если они совместимы.

42
Q

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

A

При переопределении метода нельзя сузить модификатор доступа к методу (например с public в MainClass до private в Class extends MainClass). Изменить тип возвращаемого значения при переопределении метода нельзя, будет ошибка attempting to use incompatible return type. Но можно сузить возвращаемое значение, если они совместимы.

43
Q

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

A

super.method();

44
Q

Какие преобразования называются нисходящими и восходящими?

A

Преобразование от потомка к предку называется восходящим, от предка к потомку — нисходящим. Нисходящее преобразование должно указываться явно с помощью указания нового типа в скобках.

45
Q

Чем отличается переопределение от перегрузки?

A

Переопределение используется тогда, когда вы переписываете (переделываете, переопределяете) УЖЕ существующий метод. Перегрузка — это использование одного имени, но с разными входными параметрами. Например нам нужно, чтобы метод toString() для нашего класса выдавал какой-то осмысленный текст. Тогда мы переопределяем метод из класса Object и реализуем этот метод так, как нам это нужно.
Тогда как перегрузка обычно используется, чтобы не придумывать каждый раз новое имя, когда методы отличаются только входными параметрами. При перегрузке необходимый метод определяется на этапе компиляции на основе сигнатуры вызываемого метода, тогда как при переопределении нужный метод будет выявлен во время выполнения исходя из реального типа объекта.

46
Q

Где можно инициализировать статические/нестатические поля?

A

Статические поля можно инициализировать при объявлении, в статическом или динамическом блоке инициализации. Нестатические поля можно инициализировать при объявлении, в динамическом блоке инициализации или в конструкторе.

47
Q

Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?

A

Также как и локальные классы, анонимные могут захватывать переменные, доступ к локальным переменным происходит по тем же правилам:

Анонимный класс имеет доступ к полям внешнего класса.
Анонимный класс не имеет доступ к локальным переменным области, в которой он определен, если они не финальные (final) или неизменяемые (effectively final).
Как и у других внутренних классов, объявление переменной с именем, которое уже занято, затеняет предыдущее объявление.
Вы не можете определять статические члены анонимного класса.
Анонимные классы также могут содержать в себе локальные классы. Конструктора в анонимном классе быть не может.

48
Q

Как связан любой пользовательский класс с классом Object?

A

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

49
Q

Расскажите про каждый из методов класса Object.

A

public final native Class getClass() — возвращает в рантайме класс данного объекта.
public native int hashCode() — возвращает хеш-код
public boolean equals(Object obj) — сравнивает объекты.
protected native Object clone() throws CloneNotSupportedException — клонирование объекта
public String toString() — возвращает строковое представление объекта.
public final native void notify() — просыпается один поток, который ждет на “мониторе” данного объекта.
public final native void notifyAll() — просыпаются все потоки, которые ждут на “мониторе” данного объекта.
public final native void wait(long timeout) throws InterruptedException — поток переходит в режим ожидания в течение указанного времени.
public final void wait() throws InterruptedException — приводит данный поток в ожидание, пока другой поток не вызовет notify() или notifyAll() методы для этого объекта.
public final void wait(long timeout, int nanos) throws InterruptedException — приводит данный поток в ожидание, пока другой поток не вызовет notify() или notifyAll() для этого метода, или пока не истечет указанный промежуток времени.
protected void finalize() throws Throwable — вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.

50
Q

Что такое метод equals(). Чем он отличается от операции ==

A

Это метод, определенный в Object, который служит для сравнения объектов. При сравнении объектов при помощи == идет сравнение по ссылкам. При сравнении по equals() идет сравнение по состояниям объектов (реализация метода equals для нового созданного класса ложится на плечи разработчиков). С точки зрения математики equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.
Рефлексивность: для любого ненулевого x, x.equals(x) вернет true;
Транзитивность: для любого ненулевого x, y и z, если x.equals(y) и y.equals(z) вернет true, тогда и x.equals(z) вернет true;
Симметричность: для любого ненулевого x и y, x.equals(y) должно вернуть true, тогда и только тогда, когда y.equals(x) вернет true.
Также для любого ненулевого x, x.equals(null) должно вернуть false

51
Q

Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?

A

При переопределении equals() обязательно нужно переопределить метод hashCode(). Равные объекты должны возвращать одинаковые хэш коды.
Хеш-код — это число. Если более точно, то это битовая строка фиксированной длины, полученная из массива произвольной длины. В терминах Java, хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.

52
Q

Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?

A

Этот метод реализован таким образом, что для одного и того же входного объекта, хеш-код всегда будет одинаковым. Следует понимать, что множество возможных хеш-кодов ограничено примитивным типом int, а множество объектов ограничено только нашей фантазией. Отсюда следует утверждение: “Множество объектов мощнее множества хеш-кодов”. Из-за этого ограничения, вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.

Здесь главное понять, что:

Если хеш-коды разные, то и входные объекты гарантированно разные.
Если хеш-коды равны, то входные объекты не всегда равны.
Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.

53
Q

В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?

A

Хеш-код — это число. Если более точно, то это битовая строка фиксированной длины, полученная из массива произвольной длины. В терминах Java, хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.

Этот метод реализован таким образом, что для одного и того же входного объекта, хеш-код всегда будет одинаковым. Следует понимать, что множество возможных хеш-кодов ограничено примитивным типом int, а множество объектов ограничено только нашей фантазией. Отсюда следует утверждение: “Множество объектов мощнее множества хеш-кодов”. Из-за этого ограничения, вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.

Здесь главное понять, что:

Если хеш-коды разные, то и входные объекты гарантированно разные.
Если хеш-коды равны, то входные объекты не всегда равны.
Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.

53
Q

В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?

A

Хеш-код — это число. Если более точно, то это битовая строка фиксированной длины, полученная из массива произвольной длины. В терминах Java, хеш-код — это целочисленный результат работы метода, которому в качестве входного параметра передан объект.

Этот метод реализован таким образом, что для одного и того же входного объекта, хеш-код всегда будет одинаковым. Следует понимать, что множество возможных хеш-кодов ограничено примитивным типом int, а множество объектов ограничено только нашей фантазией. Отсюда следует утверждение: “Множество объектов мощнее множества хеш-кодов”. Из-за этого ограничения, вполне возможна ситуация, что хеш-коды разных объектов могут совпасть.

Здесь главное понять, что:

Если хеш-коды разные, то и входные объекты гарантированно разные.
Если хеш-коды равны, то входные объекты не всегда равны.
Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.

54
Q

Какой метод возвращает строковое представление объекта?

A

someObject.toString();

55
Q

Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?

A

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

56
Q

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

A

Те, которые используют при определении метода equals(). Хэш код должен быть равномерно распределен на области возможных принимаемых значений.

57
Q

Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?

A

Будут. При обращении по ключу мы можем не найти значение.

58
Q

Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?

A

Абстрактные классы используются только тогда, когда есть «is a» тип отношений; интерфейсы могут быть реализованы классами которые не связаны друг с другом.

Абстрактный класс может реализовывать методы; интерфейс может реализовывать статические методы начиная с 8й версии.

Интерфейс может описывать константы и методы. Все методы интерфейса по умолчанию являются публичными (public) и абстрактными (abstract), а поля — public static final. С java 8 в интерфейсах можно реализовывать default и статические методы.

В Java класс может наследоваться (реализовывать) от многих интерфейсов, но только от одного абстрактного класса.

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

59
Q

Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?

A

volatile — не используется кэш (имеется ввиду область памяти в которой JVM может сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю. Для volatile переменной JVM гарантирует синхронизацию для операций чтения/записи, но не гарантирует для операций изменения значения переменной.

transient — указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.

60
Q

Расширение модификаторов при наследовании, переопределении и сокрытии методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?

A

Действует общий принцип: расширять видимость можно, сужать нельзя. private методы видны только внутри класса, для потомков они не видны. Поэтому их и расширить нельзя.

61
Q

Имеет ли смысл объявлять метод private final?

A

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

62
Q

Какие особенности инициализации final переменных?

A

Для поля. Поле помеченное при помощи слова final не может изменить свое значение после инициализации.
Не статическое final поле можно инициализировать: при описании, в конструкторе (во всех), в статическом блоке, в динамическом блоке.
Статическое final поле (static final) инициализируется либо в статическом блоке, либо при описании.
Значение локальных переменных, а так же параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.

63
Q

Что будет, если единственный конструктор класса объявлен как final?

A

К конструктору не применимо ключевое слово final.

64
Q

Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.

A

Метод finalize() вызывается перед тем, как объект будет удален garbage collector (сборщик мусора, далее gc). Существует много различных реализаций gc. Основа работы следующая: gc помечает объекты, на которые больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызов finalize() не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью метода finalize(), присвоив его ссылку какому-то статическому методу.

65
Q

Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?

A

Это указывает на то, что хоть метод и есть в классе Object и разработчик желает им воспользоваться, то его нужно переопределить. Для этого нужно реализовать интерфейс Cloneable, чтобы соблюсти контракт.