CORE -1 Flashcards
Что такое ООП?
Методология программирования согласно которой программа есть набор обменивающихся сообщениями объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Каждый объект содержит присущие ему данные (поля) и умеет выполнять действия (методы).
Объекты обладают состоянием, единственный способ изменить состояние объекта – послать ему сообщение, в ответ на которое объект может изменить собственное состояние.
3 требования для ООП Программы
- объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;
- каждый объект является экземпляром определенного класса;
- классы образуют иерархии.
Какие преимущества у ООП?
- Возможность легкой модификации (при грамотном анализе и проектировании)
- Возможность отката при наличии версий
- Более легкая расширяемость
- Более естественная декомпозиция (разделение целого на части) программного обеспечения, которая существенно облегчает его разработку
- Слабая связанность кода.
- Сокращение количества межмодульных вызовов и уменьшение объемов информации, передаваемой между модулями.
- Увеличивается показатель повторного использования кода.
Какие недостатки у ООП?
- Потребление памяти - обьекты потребляют больше оперативной памяти, чем примитивные типы данных
- Неэффективность и неэкономное распределения памяти на этапе выполнения (по причине издержек на динамическое связывание и проверки типов на этапе выполнения).
- Излишняя универсальность. Часто содержится больше методов, чем это реально необходимо текущей программе. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом.
- Сложно начать - парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени
- Резко увеличивается время на анализ и проектирование систем
- Увеличение времени выполнения
- Размер кода увеличивается
Назовите основные принципы ООП
- Инкапсуляция - сокрытие реализации.
- Наследование - создание новой сущности на базе уже существующей.
- Полиморфизм - возможность иметь разные формы для одной и той же сущности.
- Абстракция - набор общих характеристик.
- Посылка сообщений - форма связи, взаимодействия между сущностями.
- Переиспользование - все озвученные принципы заточены под повторное использование кода.
Что такое инкапсуляция?Пример
Это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
*Модификаторы доступа:
(Access modifiers:
-private
-default (package visible)
-protected
-public)
* Геттеры и Сеттеры (Getters and Setters)
Внешние объекты и классы не имеют прямого доступа к полям объекта. Объект имеет внешние методы (API), позволяющие внешнему миру с ним взаимодействовать. Но каким образом работа выстроена внутри объекта - на это внешние пользователи влиять не должны.
Цель инкапсуляции - уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.
Состояние объекта - это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов.
Необходимо убрать возможность случайного/умышленного изменения объекта.
Пример:
Кондиционер (берем пульт включаем допустим режим холод - запускаются разные процессы, которые не показываются пользователю), пользователю на пульте высвечивается температура воздуха на выходе, остальное все скрыто.
Инкапсуляция является фундаментальным концептом в Java (а также во многих других объектно-ориентированных языках программирования), который предполагает скрытие деталей реализации объекта от внешнего мира и предоставление четко определенного интерфейса для взаимодействия с объектом.
В Java инкапсуляция достигается с помощью определения private, protected и public полей и методов в классе. Поля и методы, объявленные как private, могут быть доступны только внутри класса и не могут быть изменены или прочитаны извне. Protected поля и методы могут быть доступны только внутри класса и его наследников. Public поля и методы могут быть доступны из любого места в программе.
При использовании инкапсуляции объекты скрывают свою внутреннюю реализацию от клиента, что позволяет легко модифицировать и расширять код без необходимости изменения внешнего интерфейса. Это также повышает безопасность программы, так как позволяет контролировать доступ к объектам и их методам.
Что такое наследование?Пример
Наследование - свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью(поля и методы).
Класс, от которого производится наследование, называется предком, базовым или родительским.
Новый класс – потомком, наследником или производным классом.
class Employee extends Person {}
Запретить наследование - public final class.
Что такое полиморфизм? Пример
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
К объекту можно обращаться через интерфейсы родительского класса, а реализация их уже будет зависеть от самого объекта.
Полиморфизм бывает динамическим (переопределение) и статическим (перегрузка).
**Животное[] –> {собака, кошка}.
Животное[1].голос –> “Гав”;
Животное[2].голос –> “Мяу”;
Преимущество полиморфизма
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий.
Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.
Ключевая особенность полиморфизма
Использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).
Полиморфная переменная и функция
Полиморфная переменная, это переменная, которая может принимать значения разных типов.
Полиморфная функция, это функция у которой хотя бы один аргумент является полиморфной переменной. Выделяют два вида полиморфных функций:
- ad hoc, функция ведет себя по разному для разных типов аргументов (например, функция draw() — рисует по разному фигуры разных типов);
- параметрический, функция ведет себя одинаково для аргументов разных типов (например, функция add() — одинаково кладет в контейнер элементы разных типов).
Абстрагирование и Абстракция
Абстрагирование - это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.
Абстракция - это набор всех таких характеристик. (телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).
Объект-класс-абстрактный класс-Интерфейс (макс. уровень абстракции).
Что представляет собой «обмен сообщениями»
Объекты взаимодействуют, посылая и получая сообщения.
Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
В ООП отправка сообщения (вызов метода) — это единственный путь передать управление объекту.
Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод.
Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding).
Что такое Класс?
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
Класс - описывает существование всех характеристик объекта, но в общем случае не дает им конкретных значений.
С точки зрения структуры программы, класс является сложным типом данных.
Укажите, из каких элементов состоит класс.
1) Поля
2) Методы
3) Конструкторы
4) Статический и
5) динамический блоки инициализации.
Поля - хранилища данных.
Методы - операции, выполняемые классами.
Конструкторы - особые методы, работающие при создании экземпляра класса. Они инициализируют поля объекта.
Что такое Объект?
Объект (экземпляр) – это представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.
Что такое Интерфейс?
Интерфейс - набор всех публичных методов класса в совокупности с набором публичных атрибутов.
Интерфейс специфицирует класс, четко определяя все возможные действия над ним.
Что такое ассоциация?
Ассоциация обозначает связь между объектами.
Композиция и агрегация - частные случаи ассоциации часть-целое .
- является(IS A) подразумевает наследование.
- имеет(HAS A) подразумевает ассоциацию (агрегацию или композицию).
Что такое композиция?
Композиция - это метод проектирования, методика создания классов из уже существующих.
При композиции новый класс включает в себя прошлые, то есть реализуется отношение “has-a”.
Машина HAS-A Двигатель
Что такое агрегация?
Агрегация - метод проектирования, менее строгий вариант композиции. Реализуется отношение “has-a”.
Но: время существования внутренних объектов не зависит от времени существования объекта-контейнера.
Агрегация предполагает, что объекты связаны взаимоотношением part-of (часть).
Реализация Агрегации и Композиции в Java?
Например, книга состоит из страниц и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация.
Агрегация и Композиция реализуются в Java с помощью полей, ссылающихся на объекты других классов. Например:
class Auto { Engine engine; Wheel wheel; ... }
Что такое связывание методов (binding)?
Связывание - это присоединение вызова метода к телу метода.
Иначе говоря - когда на строчке вызван метод, куда идти за инструкциями, что делать.
Существует:
* Раннее (статическое) связывание;
* Позднее (динамическое) связывание.
Исходя из того, что раннее связывание выполняется на этапе компиляции, а позднее - в рантайме, первый вариант обладает лучшим быстродействием, однако второй необходим для реализации полиморфизма.
Что такое РАННЕЕ связывание методов (early binding)?
Раннее (статическое) связывание - проводится компилятором перед запуском программы- на этапе компиляции.
Вызываемый метод определяется по типу переменной.
Например, перегрузка методов; приватные, статические и final методы.
Что такое ПОЗДНЕЕ связывание методов (late binding)?
Позднее (динамическое) связывание -проводится на этапе выполнения(runtime), в зависимости от типа объекта.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
Например переопределение методов. Компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода.