← Назад к вопросам

Какие технические инструменты ООП выражены в коде

2.0 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Технические инструменты ООП в коде

Объектно-ориентированное программирование реализуется через конкретные инструменты и механизмы в коде. Разберём основные из них и как они применяются в Java.

1. Классы (Classes)

Определение

Класс - это чертёж (шаблон) для создания объектов с заданными свойствами и поведением.

public class Car {
    // Свойства (состояние)
    private String color;
    private String model;
    private int speed;
    
    // Методы (поведение)
    public void accelerate() {
        speed += 10;
    }
    
    public void brake() {
        speed = 0;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
}

// Использование
Car myCar = new Car();  // Создание объекта (экземпляра)
myCar.setColor("red");
myCar.accelerate();

2. Инкапсуляция (Encapsulation)

Определение

Прятание внутренних деталей объекта, предоставление доступа только через публичный интерфейс.

Уровни доступа

public class BankAccount {
    // private - доступна только внутри класса
    private double balance;
    private String accountNumber;
    
    // protected - для класса и наследников
    protected void logTransaction(String msg) {
        System.out.println(msg);
    }
    
    // public - доступна всем
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            logTransaction("Deposit: " + amount);
        }
    }
    
    // package-private (без модификатора)
    void internalTransfer(double amount) {
        // видна только в пакете
    }
}

// Использование
BankAccount acc = new BankAccount();
acc.deposit(100);      // ✅ OK (public)
acc.balance = -50;     // ❌ Error (private)
acc.logTransaction("-");  // ❌ Error в другом пакете

3. Наследование (Inheritance)

Определение

Класс может наследовать свойства и методы от другого класса (родителя).

// Родительский класс
public class Animal {
    protected String name;
    
    public void eat() {
        System.out.println(name + " is eating");
    }
    
    public void sleep() {
        System.out.println(name + " is sleeping");
    }
}

// Дочерний класс наследует от Animal
public class Dog extends Animal {
    public void bark() {
        System.out.println(name + " is barking");
    }
    
    // Переопределение метода родителя
    @Override
    public void eat() {
        System.out.println(name + " is eating dog food");
    }
}

// Использование
Dog dog = new Dog();
dog.name = "Rex";
dog.eat();    // Переопределённый метод
dog.sleep();  // Унаследованный метод
dog.bark();   // Собственный метод

Иерархия наследования

public abstract class Vehicle {
    protected String brand;
    public abstract void move();
}

public class Car extends Vehicle {
    @Override
    public void move() {
        System.out.println("Driving on roads");
    }
}

public class Boat extends Vehicle {
    @Override
    public void move() {
        System.out.println("Sailing on water");
    }
}

4. Полиморфизм (Polymorphism)

Определение

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

Полиморфизм во время выполнения (Runtime/Dynamic)

public abstract class Shape {
    public abstract double getArea();
}

public class Circle extends Shape {
    private double radius;
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public class Rectangle extends Shape {
    private double width, height;
    
    @Override
    public double getArea() {
        return width * height;
    }
}

// Использование полиморфизма
List<Shape> shapes = Arrays.asList(
    new Circle(5),
    new Rectangle(4, 6),
    new Circle(3)
);

// Один цикл работает с разными типами
for (Shape shape : shapes) {
    System.out.println(shape.getArea());  // Вызывает правильную реализацию
}

Полиморфизм во время компиляции (Compile-time/Static)

public class Calculator {
    // Перегрузка метода
    public int add(int a, int b) {
        return a + b;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
    
    public String add(String a, String b) {
        return a + b;
    }
}

Calculator calc = new Calculator();
System.out.println(calc.add(5, 3));           // int version
System.out.println(calc.add(5.5, 3.2));       // double version
System.out.println(calc.add("Hello ", "World"));  // String version

5. Абстракция (Abstraction)

Определение

Покрытие сложных деталей реализации, предоставление простого интерфейса.

Абстрактные классы

public abstract class DatabaseConnection {
    public abstract void connect();
    public abstract void disconnect();
    public abstract ResultSet executeQuery(String sql);
    
    // Конкретный метод
    public void logQuery(String sql) {
        System.out.println("Executing: " + sql);
    }
}

public class MySQLConnection extends DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Connecting to MySQL...");
    }
    
    @Override
    public void disconnect() {
        System.out.println("Disconnecting from MySQL...");
    }
    
    @Override
    public ResultSet executeQuery(String sql) {
        logQuery(sql);  // Используем конкретный метод
        // Специфичная для MySQL реализация
        return null;
    }
}

Интерфейсы

public interface PaymentProcessor {
    boolean processPayment(BigDecimal amount);
    void refund(String transactionId);
}

public class StripePaymentProcessor implements PaymentProcessor {
    @Override
    public boolean processPayment(BigDecimal amount) {
        // Специфичная для Stripe реализация
        return true;
    }
    
    @Override
    public void refund(String transactionId) {
        // Специфичная для Stripe реализация
    }
}

public class PayPalPaymentProcessor implements PaymentProcessor {
    @Override
    public boolean processPayment(BigDecimal amount) {
        // Специфичная для PayPal реализация
        return true;
    }
    
    @Override
    public void refund(String transactionId) {
        // Специфичная для PayPal реализация
    }
}

6. Композиция vs Наследование

Наследование (is-a)

public class Vehicle {
    protected String brand;
}

public class Car extends Vehicle {
    // Car IS-A Vehicle
}

Композиция (has-a)

public class Engine {
    public void start() {}
}

public class Car {
    private Engine engine;  // Car HAS-A Engine
    
    public void start() {
        engine.start();  // Делегирование
    }
}

7. Методы и их модификаторы

Статические методы и поля

public class MathUtils {
    public static final double PI = 3.14159;
    
    public static double square(double x) {
        return x * x;
    }
}

// Использование без создания объекта
double result = MathUtils.square(5);
System.out.println(MathUtils.PI);

Константы

public class Configuration {
    // Констанста - final и static
    public static final int MAX_CONNECTIONS = 100;
    public static final String API_URL = "https://api.example.com";
    
    private int currentConnections = 0;
    
    public void addConnection() {
        if (currentConnections >= MAX_CONNECTIONS) {
            throw new RuntimeException("Max connections reached");
        }
        currentConnections++;
    }
}

8. Getter'ы и Setter'ы

Контролируемый доступ к полям

public class User {
    private String email;
    private int age;
    
    public String getEmail() {
        return email;
    }
    
    public void setEmail(String email) {
        if (email == null || !email.contains("@")) {
            throw new IllegalArgumentException("Invalid email");
        }
        this.email = email;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("Invalid age");
        }
        this.age = age;
    }
}

// Использование
User user = new User();
user.setEmail("john@example.com");  // Валидация
user.setEmail("invalid");  // Exception

9. Конструкторы

Инициализация объектов

public class Person {
    private String name;
    private int age;
    
    // Конструктор без параметров
    public Person() {
        this.name = "Unknown";
        this.age = 0;
    }
    
    // Конструктор с параметрами
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // Перегрузка конструктора
    public Person(String name) {
        this.name = name;
        this.age = 18;
    }
}

// Использование
Person p1 = new Person();
Person p2 = new Person("Alice", 25);
Person p3 = new Person("Bob");

10. This и Super

this - ссылка на текущий объект

public class Book {
    private String title;
    private String author;
    
    public Book(String title, String author) {
        this.title = title;   // this указывает на текущий объект
        this.author = author;
    }
    
    public String getInfo() {
        return this.title + " by " + this.author;  // Явно
    }
}

super - ссылка на родительский класс

public class Animal {
    protected String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public void describe() {
        System.out.println("Name: " + name);
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // Вызываем конструктор родителя
        this.breed = breed;
    }
    
    @Override
    public void describe() {
        super.describe();  // Вызываем метод родителя
        System.out.println("Breed: " + breed);
    }
}

11. Аннотации @Override

public class Shape {
    public double getArea() {
        return 0;
    }
}

public class Circle extends Shape {
    private double radius;
    
    @Override  // Указывает, что метод переопределяет метод родителя
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

12. Делегирование (Delegation)

public class UserService {
    private UserRepository repository;  // Делегируем ответственность
    
    public User getUser(Long id) {
        return repository.findById(id);  // Делегируем
    }
    
    public void saveUser(User user) {
        repository.save(user);  // Делегируем
    }
}

// Вместо наследования
// Composition > Inheritance

Полный пример: Система управления животными

// Абстрактный класс - абстракция
public abstract class Animal {
    protected String name;  // Инкапсуляция (protected)
    
    public Animal(String name) {  // Конструктор
        this.name = name;
    }
    
    public abstract void makeSound();  // Полиморфизм
    
    public void eat() {
        System.out.println(name + " is eating");
    }
}

// Наследование и переопределение
public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println(name + " barks: Woof!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println(name + " meows: Meow!");
    }
}

// Использование полиморфизма
public class Zoo {
    private List<Animal> animals = new ArrayList<>();
    
    public void addAnimal(Animal animal) {
        animals.add(animal);
    }
    
    public void feedAll() {
        for (Animal animal : animals) {
            animal.eat();       // Полиморфное поведение
            animal.makeSound(); // Правильная реализация для типа
        }
    }
}

// Запуск
Zoo zoo = new Zoo();
zoo.addAnimal(new Dog("Rex"));
zoo.addAnimal(new Cat("Whiskers"));
zoo.feedAll();  // Разные животные - разное поведение

Вывод

Технические инструменты ООП в коде:

  1. Классы - создание типов данных
  2. Инкапсуляция - скрытие деталей (private/public)
  3. Наследование - переиспользование кода (extends)
  4. Полиморфизм - многообразие реализаций (override, interfaces)
  5. Абстракция - упрощение интерфейса (abstract, interface)
  6. Композиция - объединение объектов (has-a)
  7. Методы - поведение (public, private, static)
  8. Модификаторы - контроль доступа (private, public, protected)
  9. Конструкторы - инициализация
  10. Getter/Setter - контролируемый доступ

Способность применять эти инструменты правильно отличает хорошего разработчика от среднего.

Какие технические инструменты ООП выражены в коде | PrepBro