Какие технические инструменты ООП выражены в коде
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Технические инструменты ООП в коде
Объектно-ориентированное программирование реализуется через конкретные инструменты и механизмы в коде. Разберём основные из них и как они применяются в 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(); // Разные животные - разное поведение
Вывод
Технические инструменты ООП в коде:
- Классы - создание типов данных
- Инкапсуляция - скрытие деталей (private/public)
- Наследование - переиспользование кода (extends)
- Полиморфизм - многообразие реализаций (override, interfaces)
- Абстракция - упрощение интерфейса (abstract, interface)
- Композиция - объединение объектов (has-a)
- Методы - поведение (public, private, static)
- Модификаторы - контроль доступа (private, public, protected)
- Конструкторы - инициализация
- Getter/Setter - контролируемый доступ
Способность применять эти инструменты правильно отличает хорошего разработчика от среднего.