Project

General

Profile

Actions

ООП

Вопросы

  1. Что такое ООП?
  2. Что такое объект?
  3. Назовите основные принципы ООП.
  4. Что такое наследование?
  5. Что такое полиморфизм? Какие проявления полиморфизма в Java Вы знаете?
  6. Что такое инкапсуляция?
  7. Что такое aбстракция?
  8. В чем преимущества объектно-ориентированных языков программирования?
  9. Как использование объектно – ориентерованного подхода улучшает разработку программного обеспечения?
  10. Имеется выражение «является» и «имеет». Что они подразумевают в плане принципов ООП? В чем разница между композицией и агрегацией?
  11. Что вы подразумеваете под полиморфизмом, инкапсуляцией и динамическим связыванием?

Ответы

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

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

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

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

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

Основных принципах (раньше их было всего 3). Эти принципы:

  • Абстракция
  • Инкапсуляция
  • Наследование
  • Полиморфизм

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

Наследование это процесс благодаря которому один объект может приобрести свойства другого объекта (наследование всех свойств одного объекта другим) и добавлять черты характерны только для него самого !

class Dog extends Animal {...}

Суперкласс -> Подкласс
Родительский -> Дочерний

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

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

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

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

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

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

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

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

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

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

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

"является" - наследование
"имеет" - композиция

В качестве примера предположим что у нас есть классы Строение, Дом и Ванная комната. Так вот Дом является строением, что нельзя сказать про Ванну, которая не является домом. А вот Дом имеет\включает в себя Ванну. Если вы хотите использовать повторно код, то не обязательно использовать наследование. Если нет отношения "является", то лучше тогда использовать композицию для повторного использования кода. Не используйте наследование для получение полиморфизма, если нет ключевой зависимости "является". Используйте интерфейсы для полиморфизма. Из спецификации можно узнать, что:

  • Ассоциация обозначает связь между объектами.
  • Агрегация предполагает, что объекты связаны взаимоотношением "part-of" (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию part-of накладывается условие, что "часть" не может одновременно принадлежать разным "хозяевам", и заканчивает своё существование вместе с владельцем.

Например:

  • мотоцикл -> cумка с багажём - ассоциация. Отношение "имеет".
  • мотоцикл -> колесо - композиция.
  • группа по интересам -> человек - агрегация. человек часть группы, но может принадлежать нескольким разным группам.

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

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

Рассмотрим пример полиморфизма:

Имеется классы: Фигура, круг и треугольник.

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

Shape shape = new Circle();
shape.draw();

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

Это удобно например если у нас есть некий метод:

public void drawShape(Shape shape){
    shape.draw();
}

Обратите внимание что в метод мы передаем параметр с типом интерфейса, т.е. мы не знаем какой именно тип объекта будем, но реализация будет таже. Далее мы можем просто создать еще класс, к примеру "Трапеция", имплементировать и имплементировать интерфейс "Фигура" и просто передать экземпляр класса в метод, ничего не меняя в реализации и вызове. Наследование это включение поведения(методы) и состояния(поля) базового класса в производный от него. В результате этого мы избегаем дублирования кода и процесс исправления ошибок в коде также упрощается. В джава есть два вида наследования:

  • Наследование классов. Каждый наследник может иметь толко одного родителя.
  • Наследование интерфейсов. Интерфейс может иметь сколько угодно родителей.

Некоторые тонкие ньюансы по поводу наследования интрефейсов и классов. Мы имеем два интерфейса с одинаковыми по имени полями. Имплементируем эти интерфейсы на каком-то классе.
Как нам вызвать поля этих интерфейсов? У нас неоднозначность. Необходимо объект класса привести к нужному интерфейсу.

AnyClass anyClass = new AnyClass();
((AnyInterface) anyClass).field;

Хорошо, что будет если мы имеем метод с одинаковой сигнатурой в интерфейсах и реализуем эти интерфейсы на классе. Как нам в классе реализовать два метода с одинаковой сигнатурой???

Ответ : никак, мы просто реализовываем один общий метод в классе. Это является недостатком, так как нам может потребоваться разная реализация.

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

Updated by Александр Александров over 1 year ago · 4 revisions

Go to top