ООП - DmitryGontarenko/usefultricks GitHub Wiki

Основные понятия ООП

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

Класс – это способ описания сущности, имеющий состояние (поля) и поведение (методы), а также правила для взаимодействия с данной сущностью (контракт).

Объект – это отдельный экземпляр (представитель) класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

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

Сигнатура метода - это имя метода и список параметров (порядок не важен), возвращаемое значение в сигнатуру не входит.

Контракт - это правила для взаимодействия с какой-либо сущностью. В Java контракт может быть описан с помощью методов (класса или интерфейса). Контракт определяет, что этот компонент ожидает от клиентов (например, параметры метода) и что клиенты могут ожидать от него (например, возвращаемое значение). Следовательно, методы, которые определены контрактом и которые доступны для использования клиентам, должны быть public.

Принципы ООП

Наследование

Наследование - это передача открытого и защищенного состояния или поведения от одного класса к другому.

Наследование позволяет описать новый класс на основе уже существующего, при этом свойства и функциональность базового класса заимствуются новым классом (подклассом).
При создании объекта производного класса - его конструктор автоматически будет вызывать конструктор по умолчанию из базового класса. Конструктор базового класса присвоит всем полям значения по умолчанию и только после этого конструктор производного класса продолжит работу.
Это происходит потому, что все поля базового класса должны быть проинициализированы, ведь неизвестно, будут ли они проинициализированы в производном классе или нет, поэтому необходим переход в конструктор базового класса.
Но, пользовательский конструктор из базового класса в производном классе, можно вызывать с помощью метода super().

Пример:

@AllArgsConstructor
class ClassA {
    public int field1;
}

class ClassB extends ClassA {
    public int field2;

    public ClassB(int field1, int field2) {
        super(field1); // конструктор базового класса
        this.field2 = field2;
    }
}

public class Application {
    public static void main(String[] args) {
        ClassB classB = new ClassB(1, 2);
        System.out.println(classB); // 1, 2
    }
}

Полиморфизм

Полиморфизм - это возможность объектов c одинаковым назначением иметь различную реализацию.

Реализаций полиморфизма несколько.
Динамический полиморфизм - достигается за счет переопределение методов класса.
Пример:

interface Developer {
    String writeCode();
}

// реализация интерфейса №1
class JavaDeveloper implements Developer {
    public String writeCode() {
        return "Writing Java code";
    }
}

// реализация интерфейса №2
class PythonDeveloper implements Developer {
    public String writeCode() {
        return "Writing Python code";
    }
}

public class App {
    public static void main(String[] args) {
        Developer java = new JavaDeveloper(); // Writing Java code
        Developer python = new PythonDeveloper(); // Writing Python code
    }
}

Статические полиморфизм - достигается за счет перегрузки методов. Перегрузка методов означает, что в классе есть несколько методов, имеющих одинаковое имя, но разное количество, порядок или тип параметров.
Пример:

public class App {
    static void doSomething(String s1, int i1) { }
    static void doSomething(int i1, String s1) { }
    static void doSomething(String s1, String s2, String s3) { }
}

Инкапсуляция

Инкапсуляция - сокрытие реализации.

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

Абстракция

Абстракция - это способ выделить набор общих характеристик объекта, исключая из рассмотрения незначимые.

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

Ссылки

Polymorphism in Java