ООП - 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) { }
}
Инкапсуляция
Инкапсуляция - сокрытие реализации.
Это свойство, позволяющее скрыть детали реализации от пользователя. Если нужно вносить изменения, методы для этого тоже должны лежать в самом объекте — посторонние объекты и классы этого делать не могут. Для внешних объектов доступны только публичные атрибуты и методы.
Абстракция
Абстракция - это способ выделить набор общих характеристик объекта, исключая из рассмотрения незначимые.
Абстракция, с точки зрения программирования, это правильное разделение программы на объекты.