Когда тебя спрашивают, что такое машина. Вероятный ответ заключается в том, что автомобиль — это объект с четырьмя закругленными колесами, который может перемещаться на расстояние в любое время, когда на него действует механическая сила. Что подчиняется 3-му закону движения Ньютона.

Независимо от того, является ли автомобиль игрушечным или настоящим автомобилем, единственное, что вы знаете, это то, что автомобиль должен иметь некоторые детали, скрытые от невооруженного глаза, он должен иметь некоторые кнопки, которые при нажатии выполняют определенную функцию, а также автомобиль может появиться в разные модели, вроде тойоты камри или хонды аккорд. Но здесь марка или название не имеют значения, все, что мы знаем, это то, что поведение и операции автомобиля похожи.

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

Объектно-ориентированное программирование предлагает устойчивый способ написания спагетти-кода. Он позволяет добавлять программы в виде серии исправлений.
— Пол Грэм

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

Мы можем определить объект в ООП как класс, потому что класс имеет некоторый шаблон, который поощряет определение такого объекта. например, мы можем сесть в машину, что является данными, которые мы можем определить в классе, мы можем определить метод класса «start()», который будет вызываться каждый раз, когда нажимается кнопка запуска в машине.

Объект – это базовая единица объектно-ориентированного программирования, представляющая реальные сущности. Типичная программа на Java создает множество объектов, которые, как вы знаете, взаимодействуют посредством вызова методов. Объект состоит из:

  1. Состояние: оно представлено атрибутами объекта. Он также отражает свойства объекта.
  2. Поведение: представлено методами объекта. Он также отражает реакцию объекта с другими объектами.
  3. Идентификация: присваивает объекту уникальное имя и позволяет одному объекту взаимодействовать с другими объектами.
  4. Метод. Метод – это набор инструкций, которые выполняют определенную задачу и возвращают результат вызывающему объекту. Метод может выполнять определенную задачу, ничего не возвращая. Методы позволяют нам повторно использовать код без его повторного ввода. В Java каждый метод должен быть частью некоторого класса, отличного от таких языков, как C, C++ и Python.
    Методы экономят время и помогают нам повторно использовать код без повторного ввода кода.

У нас есть вал внутри двигателя автомобиля, который полностью скрыт от нас, но без него функция start() скорее всего выдаст ошибку. Вал абстрагирован от нас, нам не нужно знать, что он делает в машине, но его работа, скорее всего, известна классу, который его реализует.

Когда модель автомобиля готова, мы можем приступить к созданию различных версий автомобиля. Toyota venza и Toyota Avalon имеют почти одинаковый двигатель. Основное различие заключается в названии, конструкции кузова и дизайне интерьера. Таким образом, теперь мы можем сказать, что они, вероятно, наследуют эти свойства от той же модели или класса автомобиля.

Все это приводит нас к основному принципу ООП, а именно к наследованию, абстракции, полиморфизму и инкапсуляции.

Давайте определим класс автомобиля и используем его, чтобы объяснить, что это за термины.

package Car;

public class Car {
    private String brand;
    private String model;
    private int mileage;
    private int engineCapacity;

    public Car(String brand, String model, int mileage, int engineCapacity) {
        this.brand = brand;
        this.model = model;
        this.mileage = mileage;
        this.engineCapacity = engineCapacity;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public int getMileage() {
        return mileage;
    }

    public void setMileage(int mileage) {
        this.mileage = mileage;
    }

    public int getEngineCapacity() {
        return engineCapacity;
    }

    public void setEngineCapacity(int engineCapacity) {
        this.engineCapacity = engineCapacity;
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", model='" + model + '\'' +
                ", mileage=" + mileage +
                ", engineCapacity=" + engineCapacity +
                '}';
    }

    private void start() {
        System.out.println("Car is starting");
    }

    private void stop() {
        System.out.println("Car is stopping");
    }

    public void pushStartButton() {
        start();
    }

    public void pushBreak() {
        stop();
    }
}

Что здесь происходит:

Во-первых, у нас есть инкапсуляция, которая определяется как объединение данных в единый блок. Это механизм, который связывает воедино код и данные, которыми он манипулирует. Другой способ представить инкапсуляцию — это защитный экран, который предотвращает доступ к данным кода за пределами этого экрана. Как и при инкапсуляции, данные в классе скрыты от других классов, поэтому это также называется сокрытием данных. Инкапсуляция может быть достигнута путем объявления всех переменных в классе как частных и написания общедоступных методов в классе для установки и получения значений переменных.

Во-вторых, у нас есть абстракция. Абстракцию данных можно определить как процесс определения только необходимых характеристик объекта, игнорируя несущественные детали. Свойства и поведение объекта отличают его от других объектов подобного типа, а также помогают классифицировать/группировать объекты.
Рассмотрим человека, который водит машину. Человек знает только, что нажатие на кнопку пуска заведет машину, а педаль акселератора увеличит скорость автомобиля или нажатие на тормоз остановит машину, но он не знает, как при нажатии на кнопку пуска машина заводится или при нажатии на педаль акселератора скорость на самом деле увеличивается, он не знает о внутреннем механизме автомобиля или реализации акселератора, тормозов и т. д. в автомобиле.

Теперь давайте иметь класс Toyota

package Car;

public class ToyotaCamry extends Car {
    public ToyotaCamry(String brand, String model, int mileage, int engineCapacity) {
        super(brand, model, mileage, engineCapacity);
    }

    @Override
    public void pushStartButton() {
        System.out.println("Welcome To Toyota Camry is starting.");
        super.pushStartButton();
    }

    @Override
    public void pushBreak() {
        System.out.println("Thank you for using Toyota Camry.");
        super.pushBreak();
    }

    @Override
    public void setModel(String model) {
        super.setModel(model);
    }

    @Override
    public void setBrand(String brand) {
        super.setBrand(brand);
    }

}

В-третьих, у нас есть наследование, которое представляет собой механизм в java и некоторых языках программирования, с помощью которого один класс может наследовать функции (поля и методы) другого класса.

Давайте обсудим некоторые часто используемые важные термины:

  • Суперкласс. Класс, функции которого наследуются, называется суперклассом (или базовым классом, или родительским классом).
  • Подкласс. Класс, наследующий другой класс, называется подклассом (или производным классом, расширенным классом или дочерним классом). Подкласс может добавлять свои собственные поля и методы в дополнение к полям и методам суперкласса.
  • Повторное использование.Наследование поддерживает концепцию «повторного использования», т. е. когда мы хотим создать новый класс, а уже есть класс, который включает часть кода, который нам нужен, мы можем получить наш новый класс из существующий класс. Делая это, мы повторно используем поля и методы существующего класса.

Наконец, полиморфизм — это способность объекта принимать различные формы.

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

Все объекты Java считаются полиморфными, поскольку они имеют более одного отношения IS-A (по крайней мере, все объекты проходят тест IS-A для своего собственного типа и для класса Object).

Мы можем получить доступ к объекту через ссылочную переменную. Ссылочная переменная может быть только одного типа. После объявления тип ссылочной переменной не может быть изменен.

Ссылочная переменная может быть объявлена ​​как тип класса или интерфейса.

На один объект могут ссылаться ссылочные переменные многих разных типов, если они относятся к одному и тому же типу или супертипу объекта.