В Java присутствует несколько терминов, которые регулируют отношения между классами. Например:
наследование;
ассоциация и ее частные случаи: композиция и агрегация.
Отношения между классами наиболее часто вызывают проблемы у молодых Java-разработчиков. На самом деле, все довольно просто, но в то же время важно, ведь на правильном использовании отношений между классами Java строится ее объектно-ориентированная направленность. Поэтому важно разобраться с отличиями между разными отношениями.
Сегодня в статье мы разберем несколько наиболее важных и часто используемых видов отношений в Java.
Наследование Java
Наследование в Java, как и в других языках программирования, — это способ, используя который можно создать новый класс на основе родительского. Родительский класс — этот тот класс, который ранее уже был создан и имеет собственные свойства и характеристики. Класс-наследник — это новый созданный класс, который наследует от родительского все поля и методы, однако добавляет некое собственное уникальное свойство или характеристику.
Самый простой пример — это описание автомобиля. Представим ситуацию, что вам нужно составить программу, описывающую автопарк. В этом случае нужно будет определить родительский класс «автомобиль», который будет описывать все имеющиеся автомобили. Однако каждый отдельный вид автомобилей будет классом-наследником класса «автомобиль». Например, это могут быть следующие типы автомобилей:
«грузовой автомобиль»,
«легковой автомобиль»,
«микроавтобус»,
«автобус»,
«спортивный автомобиль»,
и др.
Общий класс «автомобиль» будет содержать общие свойства для всех типов авто, а каждый отдельный тип будет содержать свойства, характерные именно этому типу. Например:
«год выпуска»,
«грузоподъемность»,
«вид топлива»,
«вместимость пассажиров»,
«максимальная скорость»,
«разгон до 100 км/ч»,
и др.
Говорят, что можно обходиться без родительского класса. Да, можно. Но использование родительского класса помогает существенно сократить объем кода, потому что в родительском классе описываются общие свойства для всех классов-наследников. Если не создавать родительский класс, тогда все общие свойства придется прописывать в каждом классе. А теперь представьте, что у вас десятки классов-наследников и в каждом будут писаться одни и те же строки кода. К примеру, все классы-наследники класса «автомобиль» могут:
заводиться,
разгоняться,
тормозить,
стоять на месте заведенными,
затягивать ручник,
ехать на первой, второй, третьей и др. передаче,
и др.
Все это может быть свойствами, методами и функциями класса. Можно все это описать один раз в родительском классе и больше не повторяться. А если не использовать родительский класс, тогда придется все это раз за разом описывать в каждом отдельном классе.
Наследование Java: реализация в коде
Мы подробно описали словами, что такое наследование в Java. Теперь давайте посмотрим, как такое взаимоотношение выглядит в небольшой программе:
public class AutoCar {
private String typeAuto;
private int maxAcceleration;
private int yearOfProduction;
public AutoCar(String typeAuto, int maxAcceleration, int yearOfProduction) {
this.typeAuto = typeAuto;
this.maxAcceleration = maxAcceleration;
this.yearOfManufacture = yearProduction;
}
public void accelerate() {
//...описываем ускорение
}
public void braking() {
//...описываем торможение
}
}
public class cargoVehicle extends AutoCar {
public cargoVehicle(String typeAuto, int maxAcceleration, int yearOfProduction) {
super(typeAuto, maxAcceleration, yearOfProduction);
}
}
public class SportCar extends AutoCar {
public SportCar(String typeAuto, int maxAcceleration, int yearOfProduction) {
super(typeAuto, maxAcceleration, yearOfProduction);
}
}
При этом, если нужно, тогда в классах-наследниках возможно написать любые уникальные свойства. С этим нет никаких проблем.
Некоторые пользователи интересуются, каким образом в Java организуется множественное наследование? Никаким. В Java не существует такого понятия, как множественное наследование. Класс-наследник может наследовать свойства только от единственного родительского класса. Напомним, что множественное наследование — это возможность класса-наследника наследовать свойства от нескольких родительских классов. В других объектно-ориентированных языках множественное наследование присутствует, а в Java нет.
Композиция и агрегация в Java
Композиция и агрегация в Java являются составляющей ассоциативных взаимоотношений между классами. Ассоциация подразумевает, что между двумя классами есть некие взаимоотношения. Например:
учитель и ученик,
полицейский и преступник,
банк и деньги,
магазин и товар,
и др.
Это примеры ассоциаций из жизни, но в программировании они появляются точно по таким же правилам. А главное правило — это наличие связи между классами.
Композиция и агрегация в Java показывают «силу» связей между ассоциативными классами. Например:
Агрегация в Java. Это такой вид ассоциации, который указывает нам, что один класс является частью другого. Например, у нас определен класс «микроавтобус» и определен класс «пассажир». Пассажир является частью класса «микроавтобус». Однако взаимосвязь не слишком строгая, потому что один и тот же «пассажир» может быть составляющей разных классов, например: «автобус», «такси», «спортивный автомобиль» и др. Такие «не строгие» ассоциативные связи и называются агрегацией.
Композиция в Java. Это более строгая ассоциативная взаимосвязь, которая показывает, что один класс принадлежит другому классу и не может принадлежать прочим классам. Например, класс «человек» содержит класс «руки». Класс «руки» принадлежит конкретному классу «человек» и не может принадлежать другими классам.
Заключение
Сегодня мы поговорили о таких взаимоотношениях между классами, как наследование, агрегация и композиция в Java. Наиболее ценным отношением является наследование в Java, поэтому на нем мы остановились немного подробнее. Наследование используется довольно часто в ООП, поэтому важно научиться его применять.
JavaScript