ООП Flashcards

1
Q

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

A

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

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

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

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

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

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

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

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