ООП

ООП #

1. Что такое ООП? #

ООП - методология программирования, центральное место в которой занимает объект. Программа же в целом - совокупность объектов (экземпляров классов). Класс в свою очередь представляет собой шаблон и состоит из:

  • Полей
  • Конструктора
  • Методов

2. Плюсы и минусы ООП #

Плюсы:

  • Делим программу на «модули»-классы, ОБЪЕКТЫ каждый из которых делает свою часть работы.
  • Код можно повторно использовать в любом месте программы, это экономит время (не нужно писать однотипные функции для разных сущностей).
  • «Более естественная» декомпозиция ПО существенно облегчает его разработку (код легко читается и быстро пишется).
  • Возможность создавать расширяемые системы (extensible systems), именно это отличает ООП от традиционных методов программирования.

Минусы:

  • Снижение производительности, увеличение потребности памяти (Информация распределяется на множество мелких инкапсулированных объектов ⇒ на них растет количество ссылок)

3. Принципы ООП (наследование, инкапсуляция, полиморфизм, абстракция) #

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

Наследование - возможность порождать один класс от другого(родительского) с сохранением всех его свойств и методов, добавляя при необходимости новые свойства и методы

Полиморфизм - возможность использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Полиморфизм бывает:

  • Динамическим (@Override) Берем метод из родительского класса и пишем свою - специфическую реализацию
  • Статическим (перегрузка) Можно определить внутри одного класса несколько методов с одинаковым названием, но при условии, что параметры этих методов различны

Абстракция – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких характеристик.


Наследование расширяет функционал родителя?

Да, наследование позволяет добавлять новый функционал в класс-наследник.


Сужение родительского функционала?

Нет, сужение функционала противоречит принципам наследования. Вы можете изменить поведение родительского метода через переопределение (@Override), но удалять или ограничивать его доступность нельзя.


Возможно сделать родительский метод приватным или его удалить?

Нет, приватные методы наследуются, но не могут быть переопределены или сделаны публичными/приватными в наследнике.


С помощью чего в Java можно реализовать полиморфизм?

  1. Абстрактные классы.
  2. Интерфейсы.
  3. Переопределение методов (method overriding).
  4. Перегрузка методов (method overloading).
  5. Ссылки на интерфейсы или базовые классы.
Animal animal = new Dog(); // Полиморфизм через базовый класс Animal.
animal.makeSound();        // Вызов метода Dog через ссылку на Animal.

4. Класс, объект, интерфейс #

Класс – это описание ещё не созданного объекта, общий шаблон. Шаблон состоит из:

  • полей (имя, возраст для чел. и т.д.). Состояние/ряд меняющихся свойств.
  • конструктора (первоначально инициализирует объект, заполняет нужные поля)
  • методов (что умеет делать объект). Действия, функции конкретного объекта.

Объект – это экземпляр класса, созданный по шаблону (выше) с собственным состоянием свойств.

Интерфейс — это абстрактный тип, который определяет контракт (набор методов), который должен реализовывать любой класс, подписавшийся на этот интерфейс. Интерфейсы позволяют задавать общие действия, которые могут выполнять различные классы, не завися от их конкретной реализации.


5. Ассоциация, агрегация, композиция #

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

Агрегация и композиция являются частными случаями ассоциации. Это более конкретизированные отношения между объектами.

Композиция — это более жёсткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежать кому-то. (Страница принадлежит только одной Книге.)

Агрегация — отношение, когда один объект является частью другого. (Двигатель поставили в одну машину, потом в другую.)


6. Статическое и динамическое связывание #

Связывание - процесс, в ходе которого программа решает, какой метод или переменная должна быть вызвана или использована. Связывание бывает:

  • Раннее статическое. Если метод известен компилятору, то происходит на этапе компиляции. Применяется для дженериков, перегруженных, private, final и static методов. Используются не объекты, а информация о типе, то есть ссылка
  • Позднее динамическое. Происходит во время выполнения программы JVM. Используется для абстрактных и переопределенных методов

7. Является – «is a», имеет – «has a» #

Наследование «is a» ЯВЛЯТЬСЯ (обобщение/расширение) – очень мощная связь

Ассоциация «has a» ИМЕТЬ (объекты ИМЕЮТ ссылки/ссылаются друг на друга)