Ответы на вопросы на собеседование ООП.

  • Что такое ООП?

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

  • Что такое объект?

Объект - именнованная модель реальной сущности, обладающая конкретными значениями свойств и проявляющая свое поведение, обладающий именем набор данных (полей и свойств объекта), физически находящихся в памяти компьютера, и методов, имеющих доступ к ним. Объект -конкретный экземпляр класса.

  • Назовите основные принципы ООП.

Принято считать, что объектно-ориентированное программирование строится на 4 основных принципах (раньше их было всего 3). Эти принципы: 
  • (Абстракция)
  • Инкапсуляция
  • Наследование
  • Полиморфизм 

  • Что такое наследование?

Наследование это процесс благодаря которому один объект может приобрести свойства другого объекта (наследование всех свойств одного объекта другим)
и добавлять черты характерны только для него самого !
class Dog extends Animal
{...}
Суперкласс -> Подкласс
Родительский -> Дочерний

  • Что такое полиморфизм? Какие проявления полиморфизма в Java Вы знаете?

Полиморфизм (polymorphism) (от греческого polymorphos) - это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач. Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.
В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий.

  • Что такое инкапсуляция?

Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса), это свойство которое позволяет  закрыть доступ к полям и методам  класса другим классам, а предоставлять  им доступ только через интерфейс(метод). При использовании объектно-ориентированного подхода не принято применять прямой доступ к свойствам какого-либо класса из методов других классов. Для доступа к свойствам класса принято задействовать специальные методы этого класса для получения и изменения его свойств. 

  • Что такое aбстракция?

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

  • В чем преимущества объектно-ориентированных  языков программирования?

Они представляют реальные объекты в  жизни, например, Машина, Джип, Счет в  банке и тд… Инкапсуляция, наследование и полиморфизм делает его еще мощнее.

  • Как использование объектно-ориентерованного подхода улучшает разработку программного обеспечения?

Основные  преимущества:
  • повторное использование кода(наследование);
  • реальное отображение предметной  области. Объекты соответствуют реальному миру(см. предыдущий пункт).

  • Имеется выражение "являетсяи "имеет". Что они подразумевают в плане принципов ООП? В  чем разница между композицией  и агрегацией?

"является" - наследование
"имеет" - композиция
В качестве примера предположим что у нас есть классы Строение, Дом и Ванная комната. Так вот Дом является строением, что нельзя сказать про Ванну, которая не является домом. А вот Дом имеет\включает в себя Ванну. Если  вы хотите использовать повторно код, то не обязательно использовать наследование. Если нет отношения "является", то лучше тогда использовать композицию для повторного использования кода.
Не  используйте наследование для получение полиморфизма, если нет ключевой зависимости "является". Используйте интерфейсы для полиморфизма.
Из  спецификации можно узнать, что 
  • Ассоциация  обозначает связь между объектами. 
  • Агрегация и композиция это частные случаи ассоциации.
Агрегация предполагает, что объекты связаны  взаимоотношением "part-of" (часть). 
Композиция  более строгий вариант агрегации. Дополнительно к требованию part-of накладывается условие, что "часть" не может одновременно принадлежать разным "хозяевам", и заканчивает своё существование вместе с владельцем.
Например: 
  • мотоцикл -> cумка с багажём - ассоциация. Отношение "имеет".
  • мотоцикл -> колесо - композиция. 
  • группа  по интересам -> человек - агрегация. человек часть группы, но может принадлежать нескольким разным группам.

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

Полиморфизм означает способность  переменно данного типа, которая  ссылается на объекты разных  типов, при этом вызывается  метод, характерный для конкретного  типа ссылки на объект.
В чем преимущество полиморфизма? Он позволяет добавлять новые классы производных объектов, не нарушая  при этом код вызова. Также использование полиморфизма называют динамическим связыванием объектов.
Рассмотрим  пример полиморфизма:
Имеется классы: Фигура, круг и треугольник.
Круг  и треугольник наследуется от фигуры соответственно. Каждый  класс имеет метод "рисовать". В круге и треугольнике этот метод  переопределен.
Так вот, создаем объект с типом "Фигура" и присваиваем ей ссылку на объект типа "Круг" и вызываем на этом объекте  метод "рисовать". В итоге вызывается метод класса "Круг", а не класса "Фигура" как ожидалось.

Фигура  ф = new Круг();
Ф.рисовать();

Также вместо класса родителя "Фигура" к  примеру можно использовать интерфейс "Фигура", определив там метод рисовать. Этот интерфейс мы имплементируем в классах "Круг" "Треугольник". Далее на интерфейсе создаем объект и присваиваем ему ссылку на объект какого-то из реализующих этот интерфейс классов.
Это удобно например если у нас есть некий метод:

public void drawShape(Фигура ф){
ф.рисовать();
}

Обратите  внимание что в метод мы передаем параметр с типом интерфейса, т.е. мы не знаем какой именно тип объекта будем, но реализация будет таже. Далее мы можем просто создать еще класс, к примеру "Трапеция", имплементировать и имплементировать интерфейс "Фигура" и просто передать экземпляр класса в метод, ничего не меняя в реализации и вызове.
Наследование  это включение поведения(методы) и состояния(поля) базового класса в производный от него.
В результате этого мы избегаем дублирования кода и процесс исправления ошибок в коде также упрощается.
В джава есть два вида наследования:
  • наследование классов. Каждый  наследник может иметь толко одного родителя.
  • наследование  интерфейсов. Интерфейс может  иметь сколько угодно родителей.
Некоторые тонкие ньюансы по поводу наследования интрефейсов и классов.
Мы  имеем два интерфейса с одинаковыми  по имени полями. Имплементируем эти  интерфейсы на каком-то классе.
Как нам вызвать поля этих интерфейсов?
У нас неоднозначность. Необходимо  объект класса привести к нужному  интерфейсу.
Класс к = new Класс();
((Интефейс1) к).поле;

Хорошо, что будет если мы имеем метод с одинаковой сигнатурой в интерфейсах и реализуем эти интерфейсы на классе. Как нам в классе реализовать два метода с одинаковой сигнатурой???
Ответ: никак, мы просто реализовываем один общий метод в классе. Это является недостатком, так как нам  может потребоваться разная реализация.

И третий случай: У нас есть класс  и интерфейс с одинаковым по сигнатуре  методом. Мы наследуемся от этого  класса и имплементируем этот интерфейс. Что нам нужно делать? ведь необходимо реализовать метод интерфейса по всем правилам.
И вот тут интересно, компилятор не выдает ошибок, так как метод уже  у нас реализован в классе родителе.

Рассказать друзьям:

33 коментарі :

  1. Про полиморфизм ерунда какая-то написана..
    Я не претендую конечно, но полиморфизм - это способность функции принимать данные различных типов.
    В ООП полиморфизм - полиморфизм подтипов, т.е функция способна принимать объекты наследники от указанного типа.
    Полиморфизм позволяет использовать методы производного класса, который не существует на момент создания базового.
    А тут - фигня какая-то..

    ОтветитьУдалить
    Ответы
    1. Способность функции принимать параметры разных типов это перегрузка. Про полиморфизм тут все верно написано, есть базовый класс и все наследованные от него реализуют функции базового класса.

      Удалить
    2. Способность функции принимать параметры разных типов это перегрузка. Про полиморфизм тут все верно написано, есть базовый класс и все наследованные от него реализуют функции базового класса.

      Удалить
    3. Да тут всё правильно написано но перегрузка функций это тоже явления полиморфизма.

      Удалить
    4. Ну и знатоки тут собрались. Оба определения правильные, так как есть разные виды полиморфизма: ad-hoc(реализуется при помощи перегрузки) и параметрический (обращение к наследующему классу, как к наследованному классу). Есть ещё разные виды, но эти основные.

      Удалить
  2. Спасибо за вопросы и ответы к ним!

    ОтветитьУдалить
  3. Перегрузак єто один из видов полиморфизма. https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

    ОтветитьУдалить
    Ответы
    1. Поправил Вашу ссылку. Для перехода нажмите здесь.

      Удалить
  4. По моему тоже слишком замудрено на полиморфизм ответ дан. В более общем смысле понятие полиморфизма нередко выражается следующим образом: "один интерфейс – множество методов". Это означает, что для группы взаимосвязанных действий можно разработать общий интерфейс. Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (т.е. метод) в каждом отдельном случае — это задача компилятора. Программисту не нужно делать это самому. Ему достаточно запомнить и правильно использовать общий интерфейс.

    ОтветитьУдалить
    Ответы
    1. Бьерн Страуструп определил полиморфизм как «один интерфейс — много реализаций».

      Удалить
    2. именно! множество реализаций, а не множество методов. т.е. один объявленный в интерфейсе метод может быть по разному реализован в разных классах,имплиментирующих данный интерфейс. А это вот"один интерфейс - много методов" - из разряда "слышал звон, но не понял где (и о чем)он"

      Удалить
  5. Осторожно! По полиморфизму написано неверно!

    ОтветитьУдалить
  6. Или ещё так:
    Полиморфизм - это свойство позволяющее использовать одно и тоже имя иетода для решения разных задач.
    Свойства:
    В нескольких классах могут быть определенны методы имеющие одинаковый заголовок, но различный код.
    Одна ссылочная переменная ссылается на объекты различных классов в разный момент времени.

    ОтветитьУдалить
  7. Прочитал ваш текст, попробовал прмиенить - сломал IDE. Кто заплатит за восстановление, буржуи?

    ОтветитьУдалить
  8. Агрегацию и композицию перепутали, у анрегации более жеская связь 1:1. Пример: Автомобиль и двигатель, у каждого есть свой серийный номер, и может быть только один автмобиль с этим двигателем, у композиции связь менее жесткая 1:n (1 < n < +infinity). Пример: автомобиль и водитель, у автомобиля может быть сколько угодно водителей, и каждый из них может водить несколько автомобилей!

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Детальный ответ на Ваш комментарий можно найти здесь(Седьмая страница), или здесь.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
    3. Вот так глупость Вы сказали!

      Удалить
  9. Здравствуйте, Vasyl.

    Я новичок в Java, нашел у вас в тексте следующий код, и не совсем его понимаю:

    Класс к = new Класс();
    ((Интерфейс)к).поле

    Разве мы не можем обратится к такому полю просто через Интерфейс1.поле?

    ОтветитьУдалить
    Ответы
    1. Наверно можно если поле static. А если нестатик то только как указано выше, потому как мы не можем создать объект интерфейса.

      Удалить
    2. Наверно можно если поле static. А если нестатик то только как указано выше, потому как мы не можем создать объект интерфейса.

      Удалить
    3. похожее видел в одном из тестов на хабре. Там было 2 интерфейса с одинаковыми полями и методами. Ошибки не будет, так как методы будут переопределены. А к константам нужно обращаться с приведением типов типа ((интерфейс)к).поле иначе, как я понимаю, точно выскочит ошибка.

      Удалить
    4. Все поля интерфейса по умолчанию final static, поэтому к ним можно обращаться через имя интерфейса Interface_name.field_name. А приведение типов в этой ситуации - извращение)

      Удалить
  10. Непогано булоб ще посилання на першоджерело побачити, бочитати таке

    Фигура  ф = new Круг();
    Ф.рисовать();

    або

    public void drawShape(Фигура ф){
    ф.рисовать();
    }

    в статі по Java без сліз неможливо. Явний недолугий переклад без подальшої правки.

    ОтветитьУдалить
  11. Зачем писать названия полей, классов и интерфейсов русскими буквами?

    ОтветитьУдалить
  12. Наверное если бы были картинки или схемы, было бы лучше. Впрочем, думаю данный материал предусмотрен для человека который уже знаком с теоретическим материалом, прочитал хотя бы одну книгу по Java и просто изучает иной взгляд. Автору огромное спасибо за то не пожалел времени и сил написать столько материла. Ваши труды заслуживают уважения.

    ОтветитьУдалить
  13. Evernote Web Clipper
    При помощи этого плагина можно сохранить статью и распечатать впоследствии, очень удобно.

    ОтветитьУдалить
  14. и про наследование - тоже бред. речь не об объектах, а о классах! нет там никакого "процесса приобретения одним объектом свойств другого" Это классы наследуют свойства родительских классов, а объект - это просто конкретный экземпляр... new ClassName...

    ОтветитьУдалить
  15. Все вопросы и ответы Человек взял с очень проверенного источника и грамотно перевел. Тут все верно, возможно где-то есть формулировки попроще, но то что тут все четко - сомнений нет.
    Спасибо за труд.

    ОтветитьУдалить
  16. Полиморфизм в ООП - это способность использования любого наследника класса в контексте (вместо/по_подобию) этого класса.

    ОтветитьУдалить
  17. Я бы сказал что полиморфизм это способность обьектов с одинаковой сигнатурой иметь множество реализаций. И звучит хорошо и по смыслу точно

    ОтветитьУдалить
  18. Полиморфизм – принцип, когда программа может использовать объекты с одинаковым интерфейсом без информации о внутреннем устройстве объекта

    ОтветитьУдалить
  19. Еще можно упомянуть, что в JAVA реализовано несколько видов полиморфизма:
    Раннее связывание(статическое) - происходит во время компиляции, используется для разрешения перегруженных методов
    Позднее связывание(динамические) - происходит во время выполнения, используется для разрешения переопределенных методов
    Параметрический полиморфизм - используя параметрический полиморфизм, функция или тип данных могут быть записаны в общем виде, так что они могут обрабатывать значения одинаково, не завися от их типа. Дженерики

    ОтветитьУдалить