(продолжение предыдущего поста)
Четыре концепции - абстракция, инкапсуляция, наследование и полиморфизм формируют основу ООП и позволяют создавать гибкие, модульные и повторно используемые программы.
1. Абстракция (Abstraction)
Суть: абстракция — это процесс сокрытия деталей реализации и предоставления пользователю только функциональности. То есть мы фокусируемся на «что делается», а не на «как это делается».
На изображении:
- Приведён пример с классом
Car (абстрактный класс), который содержит абстрактный метод stop().- Конкретные реализации (
Honda, Tesla, Ford) наследуют Car и предоставляют свою реализацию метода stop().- Визуально показано, как общий интерфейс (
Car) связан с конкретными реализациями (марки автомобилей).Пример кода:
public abstract class Car {
public abstract void stop();
}
public class Honda extends Car {
@Override
public void stop() {
System.out.println("Honda::Stop");
System.out.println("Mechanism to stop the car using break");
}
}2. Инкапсуляция (Encapsulation)
Суть: инкапсуляция — это объединение кода и данных в единый блок (класс), при этом каждый объект контролирует своё состояние. Это позволяет скрыть внутреннюю реализацию и предоставить доступ только через методы.
На изображении:
- Показана структура класса: переменные (
Variables) и методы (Methods) объединены в класс (Class).- Пример с классом
Car, где переменная name объявлена private, а доступ к ней осуществляется через методы getName() (getter) и setName(String name) (setter).Пример кода:
public class Car {
// private variable
private String name;
// getter method for name
public String getName() {
return name;
}
// setter method for name
public void setName(String name) {
this.name = name;
}
}3. Наследование (Inheritance)
Суть: наследование позволяет одному классу (производному, дочернему) наследовать свойства и методы другого класса (базового, родительского). Отражает отношение «IS-A» («является»).
На изображении:
- Схема с классом
Vehicle (базовый класс) и производными классами: Bike, Car, Bus, Truck.- Пример кода показывает, как класс
Car наследует поле brand от Vehicle и добавляет своё поле doors.- Метод
describe() переопределяется в классе Car для предоставления специфической реализации.Пример кода:
class Vehicle {
protected String brand;
// Constructor
public Vehicle(String brand) {
this.brand = brand;
}
// Method to be overridden
public String describe() {
return "This is a vehicle of brand: " + brand;
}
}
class Car extends Vehicle {
private int doors;
// Constructor
public Car(String brand, int doors) {
super(brand);
this.doors = doors;
}
// Override the describe method
@Override
public String describe() {
return "This is a car of brand: " + brand + " with " + doors + " doors.";
}
}4. Полиморфизм (Polymorphism)
Суть: полиморфизм — это способность объектов выполнять одни и те же действия разными способами. Объекты разных классов могут использоваться взаимозаменяемо, если они наследуют общий интерфейс.
На изображении:
- Разделяется на два типа: полиморфизм на этапе компиляции (Compile Time Polymorphism) и полиморфизм на этапе выполнения (Run Time Polymorphism).
- Compile Time Polymorphism включает перегрузку операторов (
Operator Overloading) и перегрузку функций (Function Overloading).- Run Time Polymorphism реализуется через виртуальные функции (
Virtual Function) и переопределение методов.- Пример: класс
Vehicle с методом start(), который переопределяется в классе Car. Объект Car может быть присвоен ссылке типа Vehicle, и при вызове start() будет выполняться реализация из Car.