JavaRush /Курсы /Модуль 2. Java Core /Ассоциация: композиция и агрегация

Ассоциация: композиция и агрегация

Модуль 2. Java Core
3 уровень , 1 лекция
Открыта

Композиция и агрегирование

Классы и объекты могут быть связаны друг с другом. Наследование описывает связь «является» (или по-английски «IS A»). Лев является Животным. Такое отношение легко выразить с помощью наследования, где Animal будет родительским классом, а Lion — потомком.

Однако не все связи отношения в мире описываются таким образом. К примеру, клавиатура определенно как-то связана с компьютером, но она не является компьютером. Руки как-то связаны с человеком, но они не являются человеком.

В этих случаях в его основе лежит другой тип отношения: не «является», а «является частью» («HAS A»). Рука не является человеком, но является частью человека. Клавиатура не является компьютером, но является частью компьютера.

Отношения HAS A можно описать в коде, используя механизмы композиции и агрегирования. Разница между ними заключается в «строгости» этих связей.

Приведем простой пример:

У нас есть наш Car — машина.

У каждой машины есть двигатель.

Кроме того, у каждой машины есть пассажиры внутри.

В чем же принципиальная разница между полями Engine engine и Passenger [] passengers? Если у машины внутри сидит пассажир А, это не значит, что в ней не могут находиться пассажиры B и C.

Одна машина может соответствовать нескольким пассажирам. Кроме того, если всех пассажиров высадить из машины, она продолжит спокойно функционировать.

Связь между классом Car и массивом пассажиров Passenger [] passengers менее строгая. Она называется агрегацией.

Есть неплохая статья на эту тему: Отношения между классами (объектами).

В ней приведен еще один хороший пример агрегации. Допустим, у нас есть класс Student, обозначающий студента, и класс StudentsGroup (группа студентов). Студент может входить и в клуб любителей физики, и в студенческий фан-клуб «Звездных войн» или команду КВН.

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

Самый простой пример — двигатель автомобиля. Двигатель является частью автомобиля, но не может быть частью другого автомобиля.

Как видишь, их связь гораздо более строгая, чем у Car и Passengers. Отношения между классами. Наследование, композиция и агрегирование  - 4
Комментарии (12)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Руслан Уровень 48
14 сентября 2025
Ассоциация •«Знают друг о друге». •❌ Никакой зависимости. •Каждый объект живёт сам по себе. •Пример: студент ↔ библиотека (студент может ходить в разные библиотеки, библиотека обслуживает разных студентов). Агрегация •Это слабое отношение «has-a». •«Часть целого, но свободная». •✅ Часть может жить отдельно. •✅ Целое может жить без части, но будет «неполноценным». •Пример: университет → студент (университет есть, даже если часть студентов отчислилась; студент может перейти в другой университет). Композиция •Это сильное отношение «has-a». •«Часть целого, но несвободная». •❌ Часть не может жить без целого. •✅ Целое может жить без конкретной части, но теряет функциональность. •Пример: дом → комната (нет дома — нет и комнаты; но дом может быть без одной комнаты, хотя станет «беднее»). 👉 Ты очень верно подметил ключ: 🔑 Вся разница в зависимости части от целого. Может кому поможет
Виктор Ш Уровень 72
4 марта 2025
Сначала было все просто как для малышей. И вдруг резко без достаточных объяснений и теории задачи. Если не копаться в других источниках, задачи не под силу. Материал про двигатель и авто должен быть объяснен в лекции! И потоки будут только через несколько уровней!
Руслан Никитин Уровень 109
25 июля 2024
Добавим теории Зависимость "Это базовая связь между объектами, которая показывает, что один класс скорее всего придется менять, при изменении названия или сигнатуры методов второго класса. Степень зависимости можно ослабить, если например ссылаться на абстрактные класса или интерфейсы" Ассоциация лат. Associatio — соединение, взаимосвязь Это строгий вариант зависимости, когда один объект взаимодествует с другим(всегда имеет доступ/ссылку). Она устанавливает связь только между двумя объектами. Ассоциация так же может быть двухсторонней. Агрегация лат. aggregatio «присоединение» Это специализированная разновидность ассоциации, которая описывает по ложение один-к-многим, многие-ко-многим, часть-целое. Обычно один объект содержит другие, то есть выступает контейнером. Контейнер не управляет жизненным циклом компонентов, компоненты могут существовать отдельно. Композиция лат. compositio — составление, связывание, сложение, соединение Это более строгий вид агрегации, когда один объект состоит из других. Особенность данного отношения заключается в том, что компонент может сущестсвовать только как чаcть контейнера.
Руслан Никитин Уровень 109
25 июля 2024
Зависимость: Класс А могут затронуть изменения в классе B Ассоциация: Объект А знает об объекте B. Класс А зависит от B (класс А имеет ссылку на объект класса B) Агрегация: Объект А знает об объекте B и состоит из него. Класс А зависит от B Композиция: Объект А знает об объекте B, состоит из него и управляет его жизненным циклом. Класс А зависит от B Реализация: Класс А определяет методы объявленные интерфейсом B. Объекты А можно рассматривать через интерфейс B. Класс А зависит от B Наследование: Класс А наследует интерфейс и реализацию класса B, но может переопределить её. Объекты А можно рассматривать через интерфейс класса B. Класс А зависит от B
Константин Уровень 100 Expert
3 июня 2022
Что бы лучше понять эту тему, посмотрите видосик https://www.youtube.com/watch?v=pZg4-qYzSWU
Alexander Уровень 81 Expert
18 августа 2022
Спасибо, стало действительно намного понятнее
jvatechs Уровень 111 Expert
5 февраля 2023
Спасибо за видос, немного систематизировалось в голове.
Андрей Пазюк Уровень 117 Expert
23 мая 2022
В задаче "Переустановка винды" в условии ошибки. 1. Там просят создать переменную типа OperationSystem, а должно быть OperatingSystem. 2. Просят создать метод updateOs(String version), а должно быть updateOS(String version). В методе main так же вызов этого метода с ошибкой в написании.
Evgen Уровень 35
17 апреля 2022
В последней задаче в правильном решении используют стримы, о которых еще даже не заикались в лекциях... Где логика в таком подходе "типо обучения" ? Этот как первокласснику дать решать задачи с пятого класса, ну а если не знаешь ответ иди ищи в гугле )) Бред полный, такие моменты напрочь убивают всю мотивацию и желание...
(delta)Roman_Sula Уровень 108 Expert
7 апреля 2022
Если вы как и я захотите назвать список продуктов как-то иначе нежели products, валидатор не примет. Геттеры и сеттеры должны быть так же завязаны на это имя.
Mykola Уровень 24
21 февраля 2022
решения не всегда очевидные. Жалко, что комментариев не стало к задачам. В них порой можно было не мало полезного по теме для лучшего понимания почерпнуть.
Sergey Drogunov Уровень 117 Expert
30 марта 2022
Это в наших руках их создать)