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

Все о переопределении в Java

У нас на этой неделе практически юбилей — стартует пятая группа «Разработчик Java», а это значит, что мы снова делимся всякими полезностями.

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

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

Что такое полиморфизм?

Полиморфизм позволяет вам определить один интерфейс и иметь для него несколько реализаций. Это один из основных принципов объектно-ориентированного программирования. Слово «полиморфизм» буквально означает «состояние наличия многих форм» или «способность принимать разные формы». При применении к объектно-ориентированным языкам программирования, таким как Java, он описывает способность языка обрабатывать объекты разных типов и классов через единый, однородный интерфейс.

Что такое полиморфизм времени выполнения (или отправка динамического метода?)

Переопределенный метод вызывается в соответствии с объектом, которому принадлежит метод, а не по типу ссылки.

В чём польза полиморфизма времени выполнения?

Статический или динамический полиморфизм?

Private, final и static методы используют статические привязки и связаны компилятором, в то время как виртуальные методы связываются во время выполнения на основе обрабатываемого объекта.

Используйте аннотацию Override, чтобы компилятор мог проверить, что вы действительно переопределяете метод, когда вы на это рассчитываете. Таким образом, если вы совершаете распространенную ошибку, например, опечатку в имени метода или неправильно задаете параметры, вы будете предупреждены о том, что ваш метод фактически не переопределяет в то время, как вы уверены в обратном. Во-вторых, это улучшает читаемость кода, делая переопределение более очевидным.

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

Правила динамического полиморфизма

Изменение сигнатуры метода

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

Тип возврата метода

Типы возвращаемых данных могут варьироваться в зависимости от методов, которые переопределяют друг друга, если типы возврата являются ссылочными типами. Java поддерживает ковариантные возвращения — специализацию типа возврата к подтипу. Объявление метода d1 с типом возврата R1 заменит возвращаемое значение метода d2 с возвращаемым типом R2 тогда и только тогда, когда выполняются следующие условия:

Ковариантный тип возврата

Возвращение коварианта означает, что при переопределении метода возвращаемый тип переопределяющего метода разрешен как подтип возвращаемого типа переопределенного метода.

Чтобы прояснить это с помощью примера, общим случаем является Object.clone (), который объявляется для возврата типа объекта. Вы можете переопределить это в своем классе следующим образом:

Переопределение статического метода (или) Связывание метода

Связывание статических переменных

Final и private методы

Переопределение уровней доступа

Переопределение с super()

Переопределение с абстракцией

Переопределение с исключениями

Переопределение из внутренних приватных классов

Переопределение и перегрузка

Переопределение методов экземпляра против статических методов

Переопределение методов экземпляра против статических переменных

Конструктор с super()

Переопределение другого и того же пакетов

Правила ребенок-родитель: последствия переопределения

Методы экземпляра предпочтительнее default методов интерфейса.

Программы, содержащие комментарии для иллюстрации использования и последствий при переопределении, могут иметь некоторые CE и RE.

Как всегда будем рады видеть ваши комментарии или вопросы.

Источник

Собеседование по Java — ООП (вопросы и ответы). Часть 1.

Вопросы и ответы по теме ООП (объектно ориентированное программирование) для собеседования по Java.

К списку вопросов по всем темам

Список всех вопросов по ООП

1. Назовите принципы ООП и расскажите о каждом.
2. Дайте определение понятию “класс”.
3. Что такое поле/атрибут класса?
4. Как правильно организовать доступ к полям класса?
5. Дайте определение понятию “конструктор”.
6. Чем отличаются конструкторы по умолчанию, копирования и конструктор с параметрами?
7. Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?
10. Дайте определение понятию “метод”.
11. Что такое сигнатура метода?
12. Какие методы называются перегруженными?
13. Могут ли нестатические методы перегрузить статические?
14. Расскажите про переопределение методов.
15. Может ли метод принимать разное количество параметров (аргументы переменной длины)?
16. Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
17. Как получить доступ к переопределенным методам родительского класса?
18. Какие преобразования называются нисходящими и восходящими?
19. Чем отличается переопределение от перегрузки?
20. Где можно инициализировать статические/нестатические поля?

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

43. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
44. Как связан любой пользовательский класс с классом Object?
45. Расскажите про каждый из методов класса Object.
46. Что такое метод equals(). Чем он отличается от операции ==.
47. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
48. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
49. В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
50. Какой метод возвращает строковое представление объекта?
51. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
52. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
53. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
54. Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?
55. Можно ли получить доступ к private переменным класса и если да, то каким образом?
56. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
57. Расширение модификаторов при наследовании, переопределение и сокрытие методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
58. Имеет ли смысл объявлять метод private final?
59. Какие особенности инициализации final переменных?
60. Что будет, если единственный конструктор класса объявлен как final?
61. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
62. Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?

Читайте также:  Фруктовая диета что можно есть

Ответы. Часть 1

1. Назовите принципы ООП и расскажите о каждом.

Объе́ктно-ориенти́рованное программи́рование (ООП) — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Основные принципы ООП: абстракция, инкапсуляция, наследование, полиморфизм.

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

Пример: описание должностей в компании. Здесь название должности значимая информация, а описание обязанностей у каждой должности это второстепенная информация. К примеру главной характеристикой для «директор» будет то, что это должность чем-то управляет, а чем именно (директор по персоналу, финансовый директор, исполнительный директор) это уже второстепенная информация.

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

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

Полиморфизм — свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пример (чуть переделанный) из Thinking in Java:

Источник

Вопросы 35-39, 41, 42, 44 (методы, их переопределение и перегрузка)

«Дайте определение понятию «метод».»
«Что такое сигнатура метода?»
«Какие методы называются перегруженными?»
«Могут ли нестатические методы перегрузить статические?»
«Расскажите о переопределение методов.»
«Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?»
«Как получить доступ к переопределенным методам родительского класса?»
«Чем отличается переопределение от перегрузки?»

1. Метод в Java — это законченная последовательность действий (инструкций), направленных на решение отдельной задачи, которая вызывается по определенному имени. По сути, это аналог функций и процедур из более ранних (не ООП) языков. Только эти функции являются членами классов и для различия с обычными функциями, согласно терминологии объектно-ориентированного программирования, называются методами.

1.1. Методы определяются внутри классов.

1.2. Если тип возвращаемого значения не void, в теле метода должен быть хотя бы один оператор return [выражение], где тип выражения должен совпадать с типом возвращаемого значения. Этот оператор возвращает результат вычисления выражения в точку вызова метода.

1.2.1. Если тип возвращаемого значения – void, возврат из метода выполняется либо после выполнения последнего оператора тела метода, либо в результате выполнения оператора return без указания выражения (таких операторов в теле метода может быть несколько).

скрытый текст 2. Сигнатура метода — это имя метода плюс его параметры (причем порядок параметров имеет значение). В сигнатуру метода не входит возвращаемое значение, бросаемые им исключения, а также модификаторы (в т.ч. public, protected, private, abstract, static, final, synchronized, native, strictfp).

3. В языке Java в пределах одного класса можно определить два или более метода, которые совместно используют одно и то же имя, но имеют разные сигнатуры. Когда это имеет место, методы называют перегру­женными, а о процессе говорят как о перегрузке метода (method overloading).

3.1. Когда метод вызывается, то по количеству фактических параметров и/или их типам среда выполнения Java определяет, какую именно версию перегруженного метода надо вызывать (тип возвращаемого значения во внимание не принимается, хотя, в принципе, он тоже может отличаться у разных версий перегруженных методов).

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

4.1. Переопределяемые методы лучше предварять аннотацией @Override. В этом случае компилятор получает возможность проверить, что вы переопределили метод, а не написали новый. Таким образом можно избежать некоторых ошибок из-за невнимательности.

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

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

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

5. Итого, и при переопределении, и при перегрузке создаются методы с одинаковым именем. Но при перегрузке у них отличается сигнатура (то есть по факту создается новый метод без необходимости придумывать новое имя), а при переопределении нет (в результате уже существующий метод переопределяется).

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

6. Модификатор static означает что метод статический, он принадлежит классу, а не конкретному его экземпляру. Из другого класса мы можем вызывать его так: [имя класса].[имя метода]().

6.1. Статические методы можно перегрузить. В том числе можно перегрузить его нестатическим методом.

6.1.1. Нельзя перегружать два метода в Java, если они отличаются только статическим ключевым словом (количество параметров и типов параметров одинаково). Т.к. их сигнатура при этом одинакова.

6.2. Статические методы не могут быть переопределены в точном смысле слова, при попытке это сделать просто будет создан другой статический метод с тем же именем. На практике это означает, что компилятор решит, какой метод будет выполняться во время компиляции, а не во время выполнения, как это происходит с переопределенными методами экземпляра (не будет полиморфизма).

Читайте также:  мы живем во власти того что нас пьянит

Источник

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

Что такое ООП? Подход (методология) к программированию ориетированный на объекты. Представление программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Базовые концепции ООП?

Укажите из каких элементов состоит класс. Класс состоит из полей (атрибуты) и методов (функции для работы с этими полями).

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

Можно ли наследовать конструктор? Нет, но ему можно передать аргументы с помощью super.

Что такое перегрузка конструктора? Это создание конструкторов с другим набором аргументов.

Что такое статический метод? Это метод, который можно вызвать без создания объекта, напрямую через имя класса.

Что такое не статический метод? Это метод, для работы которого необходим объект.

Для чего используется ключевое слово this? Чтобы обращаться к полям и методам данного класса (объекта). this(), то конструктор текущего класса, можно использовать для перевызова конструктора с параметрами.

Какой класс является базовый родительным классов для всех классов? Object

Что такое наследование? Приведите примеры из реальной жизни. Это когда один объект перенимает все публичные поля и методы другого объекта. Млекопитающиеся > Киты > Голубой кит, горбатый кит.

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

Как вызвать метод из родительского класса? с использованием ключевого слова super.

Что такое переопределение метода? Это возможность по своему написать метод родительского класса.

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

Что такое виртуальная функция и используются ли они в Java? Это функция, котора может быть переопределена наследником. В Java практически все функции виртуальные (private функции не могут быть переопределены в связи с правами видимости)

Что такое перегрузка метода? Это создание того же метода с другими аргументами.

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

Что такое инкапсуляция? Это скрытие полей объектов. Это ограничение доступа к определенным методами и полям.

Как реализована инкапсуляция в Java? Модификаторами доступа private скрываются поля объекта, и при необходимости разрешается к ним подкотрольный доступ через геттеры и сеттеры.

Что такое абстракция? Это абстрагирование от некоторых конкретных деталей объекта.

Как реализована абстракция в Java? С помощью ключевого слова abstract перед именем класса. В таком классе могут быть абстрактные методы, которые обязан реализовать дочерний класс. От абстрактного класса нельзя создать объект.

Что такое интерфейс? Это тип данных, который может содержать лишь константы, абстрактные методы (так же неабстрактные методы default и static). У них нету конструкторов. Инерфейс позволяет создавать общей тип данных для разных объектов (т.е. использование интерфейса гарантирует наличие определенного метода у объекта).

Что такое внутренний класс? Типы внутренних классов. Это класс вложенный в другой класс

Что такое анонимный класс. Это класс, который сразу создаеся и реализуется (без имени класса) от суперкласса или интерфейса.

Для чего используется конструктор в абстрактном классе? Для инициализации полей класса.

29.Можно ли создать анонимный класс. если в классе нет конструктора по умолчанию? При создании анонимного класса в скобках можно передать аргументы для недефолтового конструктора.

30.Что такое композиция? еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Например Машина и Двигатель.

31.Что такое агрегация? отношение когда один объект является частью другого. Например Студент входит в Группу любителей физики.

Как обрабатываются исключительные ситуации? или с помощью метода try-catch или передает его выше, тому методу который его вызвал.

Назовите основные методы класса Object?

Порядок вызовов конструкторов: Конструкторы вызываются в порядке наследования. От старших к младшим.

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

Перегузка методов: Совпадают имена сигнатуры разные

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

Особенности абстрактных классов. Если есть хоть один абстрактный метод, то класс должен быть абстрактным. Абстрактные классы нельзя создавать с помощью new, но можно использовать в качестве ссылки, для полиморфизма.

Как получить имя анонимного класса. имя анонимного класса anonym.getClass().toString().

Какие модификации уровня доступа вы знаете, расскажите про каждый из них? private (закрытый) — доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к private-членам. default, package, friendly, доступ по умолчанию, когда никакой модификатор не присутствует — член класса считается открытым внутри своего собственного пакета, но не доступен для кода, расположенного вне этого пакета.Т.е. если package2.Class2 extends package1.MainClass, то в Class2 методы без идентификатора из MainClass видны не будут. protected (защищённый) — доступ в пределах пакета и классов наследников. Доступ в классе из другого пакета будет к методам public и protected главного класса. Т.е. если package2.Class2 extends package1.MainClass, то внутри package2.Class2 методы с идентификатором protected из MainClass будут видны. public (открытый) — доступ для всех из любого другого кода проекта Модификаторы в списке расположены по возрастающей видимости в программе.

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

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

Читайте также:  номер вус что это

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

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

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

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

Какие особенности инициализации final static переменных? Переменные должны быть инициализированы во время объявления или в static блоке.

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

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

Расскажите про каждый из методов класса Object. 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 определил, что ссылок на объект больше нет.

Что такое метод equals() Это метод, определенный в Object, который служит для сравнения объектов. При сравнении объектов при помощи == идет сравнение по ссылкам. При сравнении по equals() идет сравнение по состояниям объектов (реализация метода equals для нового созданного класса ложится на плечи разработчиков). С точки зрения математики equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.

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

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

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

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

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

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

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

Что будет, если единственный конструктор класса объявлен как final? К конструктору не применимо ключевое слово final.

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

Почему метод clone объявлен как protected? Что необходимо для реализации клонирования? Это указывает на то, что хоть метод и есть в классе Object и разработчик желает им воспользоваться, то его нужно переопределить. Для этого нужно реализовать интерфейс Clonable, чтобы соблюсти контракт.

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

Может ли локальный класс иметь статические поля и методы? не может иметь статических полей, методов, классов (за исключением финальных);

Интерфейс может содержать только общедоступные константы (public final static long SOME_CONST = 1)

Что такое конструктор? Конструктор — это специальный метод, предназначенный для создания и инициализации экземпляра класса.

Выберите правильный конструктор: public Miniport(City city)

Может ли абстрактный метод в абстрактном класе иметь модификатор static? Нет.

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

Источник

Строительный портал