Ответ
Основные принципы ООП — это четыре фундаментальные концепции, на которых строится парадигма. Дополнительно к ним существуют уточняющие принципы SOLID.
1. Инкапсуляция
Сокрытие внутреннего состояния объекта и защита данных через публичный интерфейс.
class BankAccount {
// Данные скрыты (private)
private double balance;
private String owner;
// Доступ только через публичные методы
public BankAccount(String owner) {
this.owner = owner;
this.balance = 0.0;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public double getBalance() {
return balance;
}
}
Суть: Объект — «черный ящик» с четким контрактом (публичными методами).
2. Наследование
Создание нового класса (потомка) на основе существующего (родителя) с возможностью переиспользования и расширения его функциональности.
// Базовый класс
class Animal {
String name;
void makeSound() {
System.out.println("Some generic sound");
}
}
// Производный класс
class Dog extends Animal {
// Переопределение метода (полиморфизм)
@Override
void makeSound() {
System.out.println("Woof!");
}
// Новое поведение
void fetch() {
System.out.println("Fetching the ball...");
}
}
3. Полиморфизм
Возможность объектов с одинаковым интерфейсом (или базовым типом) выполнять операции по-разному.
Animal myAnimal = new Dog(); // Ссылка базового типа на объект потомка
myAnimal.makeSound(); // Выведет "Woof!" (вызовется метод Dog)
// Полиморфизм в коллекциях
List<Animal> zoo = Arrays.asList(new Dog(), new Cat());
for (Animal a : zoo) {
a.makeSound(); // Каждое животное издаст свой звук
}
Формы: Переопределение методов (как выше) и перегрузка методов (разные сигнатуры).
4. Абстракция
Выделение существенных характеристик объекта и игнорирование несущественных деталей.
// Абстрактный класс задает концепцию
abstract class Shape {
// Абстрактный метод — обязательный контракт для потомков
abstract double calculateArea();
// Конкретный метод с общей логикой
void printArea() {
System.out.println("Area: " + calculateArea());
}
}
class Circle extends Shape {
double radius;
Circle(double r) { radius = r; }
@Override
double calculateArea() {
return Math.PI * radius * radius;
}
}
Абстракция достигается через: абстрактные классы, интерфейсы.
Принципы SOLID
Это пять дополнительных принципов проектирования, углубляющих базовые концепции ООП:
- SRP: Принцип единственной ответственности.
- OCP: Принцип открытости/закрытости.
- LSP: Принцип подстановки Барбары Лисков.
- ISP: Принцип разделения интерфейса.
- DIP: Принцип инверсии зависимостей.