Что такое объектно-ориентированное программирование (ООП) и его основные принципы?

«Что такое объектно-ориентированное программирование (ООП) и его основные принципы?» — вопрос из категории ООП, который задают на 36% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Объектно-ориентированное программирование (ООП) — это парадигма программирования, в которой программа структурируется как набор взаимодействующих объектов, каждый из которых является экземпляром определенного класса. Класс описывает состояние (данные в полях) и поведение (методы).

Четыре основных принципа (столпа) ООП:

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

    • Что это: Сокрытие внутреннего состояния объекта и деталей реализации, предоставление контролируемого доступа через публичные методы.
    • Зачем: Обеспечивает целостность данных, уменьшает связность, упрощает поддержку.
    • Как: Использование модификаторов доступа (private, protected, public) и методов-геттеров/сеттеров.

      public class BankAccount {
      private double balance; // Поле скрыто (инкапсулировано)
      
      public double getBalance() { // Контролируемый доступ
          return balance;
      }
      public void deposit(double amount) {
          if (amount > 0) { // Валидация внутри метода
              balance += amount;
          }
      }
      }
  2. Наследование (Inheritance)

    • Что это: Механизм создания нового класса (потомка) на основе существующего (родителя), с возможностью повторного использования и расширения его функциональности.
    • Зачем: Позволяет избежать дублирования кода, создавать иерархии классов.
    • Как: Ключевое слово extends в Java.
      public class Vehicle { // Родительский класс
      protected String brand;
      public void honk() { System.out.println("Beep!"); }
      }
      public class Car extends Vehicle { // Дочерний класс
      private int doors;
      public Car(String brand, int doors) {
          this.brand = brand; // Поле унаследовано
          this.doors = doors;
      }
      }
  3. Полиморфизм (Polymorphism)

    • Что это: Способность объектов с одинаковой спецификацией (интерфейсом) иметь различную реализацию. Один интерфейс — множество форм.
    • Зачем: Повышает гибкость и расширяемость кода.
    • Как: Переопределение методов (@Override) и использование ссылок родительского типа.
      public abstract class Shape {
      public abstract double area(); // Абстрактный метод
      }
      public class Circle extends Shape {
      private double radius;
      @Override
      public double area() { return Math.PI * radius * radius; } // Своя реализация
      }
      public class Square extends Shape {
      private double side;
      @Override
      public double area() { return side * side; } // Другая реализация
      }
      // Полиморфное использование
      Shape shape1 = new Circle(5);
      Shape shape2 = new Square(4);
      System.out.println(shape1.area()); // Вызовется Circle.area()
      System.out.println(shape2.area()); // Вызовется Square.area()
  4. Абстракция (Abstraction)

    • Что это: Процесс выделения существенных характеристик объекта и игнорирования нерелевантных деталей. Моделирование сущности предметной области.
    • Зачем: Позволяет управлять сложностью, фокусируясь на взаимодействии, а не на реализации.
    • Как: Абстрактные классы (abstract class) и интерфейсы (interface).
      // Абстракция "Транспортное средство"
      public interface Vehicle {
      void startEngine(); // Контракт, скрывающий детали
      void stopEngine();
      }
      public class ElectricCar implements Vehicle {
      @Override
      public void startEngine() {
          // Специфичная реализация для электрокара
          connectBattery();
          initializeMotor();
      }
      // ... private методы connectBattery(), initializeMotor()
      }