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

Собеседование по 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:

📎📎📎📎📎📎📎📎📎📎