Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние.
Инкапсуляция - это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
В JAVA реализуется с помощью модификаторов доступа и геттеров/сеттеров.
Модификаторы доступа (Access modifiers):
public
публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов.
private
закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе.
protected
такой класс или член класса доступен из любого места в текущем классе или пакете или в производных классах, даже если они находятся в других пакетах.
default (package visible)
отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.
Геттеры и Сеттеры (Getters and Setters)
Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.
Состояние объекта – это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов. Убрать возможность случайного/умышленного изменения объекта.
Пример – кондиционер (берем пульт включаем холод - запускаются разные процессы, которые не показываются пользователю), пользователю на пульте показывается температура воздуха на выходе, остальное все скрыто.
Наследование - свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.
Наследование форма отношения «is a» (является).
Класс наследника является классом предка, но класс предка не является классом наследника: собака – наследник животного, но животное не наследник собаки. Наследник – более «узкий» класс.
Пример: кондиционер наследуется от холодильной техники.
Есть одиночное и множественное наследование (класс наследуется от нескольких классов).
Проблема – ромбовидное наследование: у одного базового класса есть два наследника, а у наследника этих двух классов свой наследник, какая реализация попадет в последний – ХЗ.
В Java множественное наследование ограничено.
Запретить наследование:
public final class
Класс, от которого производится наследование, называется предком, базовым или родительским. Новый класс – потомком, наследником или производным классом.
class Employee extends Person {}
Делегирование – один класс вызывает другой класс, не связанный наследованием.
Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Пример: интерфейс «охлаждать» имеет место в технике, холодное пиво)) и т.п.
Все if –ы можно заменить на полиморфизм (способ рефакторинга).
Позволяет уменьшать размер программы.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.
Отсюда следует ключевая особенность полиморфизма - использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).
Unit ref = new Refrigerator("ref", 24);
Полиморфная переменная - это переменная, которая может принимать значения разных типов.
Полиморфная функция - функция у которой хотя бы один аргумент является полиморфной переменной.
Выделяют два вида полиморфных функций:
(например, функция draw() — рисует по разному фигуры разных типов);
(например, функция add() — одинаково кладет в контейнер элементы разных типов).
Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.
Соответственно, абстракция – это набор всех таких характеристик.
(телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).
Объект - Класс - Абстрактный класс - Интерфейс(макс. уровень абстракции).
Ассоциация обозначает связь между объектами.
Композиция и агрегация — частные случаи ассоциации «часть-целое».
Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть).
Композиция более строгий вариант агрегации.
Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.
Например, книга состоит из страниц, и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация.
«Является» подразумевает наследование.
«Имеет» подразумевает ассоциацию (агрегацию или композицию).
Связывание - присоединение вызова метода к телу метода.
Раннее (статическое) связывание - проводится компилятором (компоновщиком) перед запуском программы.
Например, перегрузка методов; приватные, статические и final методы.
Позднее (динамическое) связывание - непосредственно во время выполнения программы (runtime), в зависимости от типа объекта.
Например, переопределение методов. Компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
public class Main {
public static void main(String[] args) {
Insurance current = new CarInsurance();
// Динамическое связывание на основе объекта потому что метод premium() нестатический
int premium = current.premium();
// Статическое связывание на основе класса, метод category() статический (принадлежит классу)
String category = current.category();
System.out.println("premium : " + premium);
System.out.println("category : " + category);
}
}
class Insurance{
public static final int LOW = 100;
public int premium() { return LOW; }
public static String category() { return "Insurance"; }
}
class CarInsurance extends Insurance {
public static final int HIGH = 200;
public int premium() { return HIGH; }
public static String category() { return "Car Insurance"; }
}
REST (Representational state transfer) – это стиль архитектуры программного обеспечения для распределенных систем, таких как World Wide Web, который, как правило, используется для построения веб-служб.
Системы, поддерживающие REST, называются RESTful-системами.
В общем случае REST является очень простым интерфейсом управления информацией без использования каких-то дополнительных внутренних прослоек. Каждая единица информации однозначно определяется глобальным идентификатором, таким как URL. Каждая URL в свою очередь имеет строго заданный формат.
Отсутствие дополнительных внутренних прослоек означает передачу данных в том же виде, что и сами данные. Т.е. мы не заворачиваем данные во что либо.
Каждая единица информации однозначно определяется URL – это значит, что URL по сути является первичным ключом для единицы данных.
Как происходит управление информацией сервиса – это целиком и полностью основывается на протоколе передачи данных. Наиболее распространенный протокол конечно же HTTP.
Архитектура REST очень проста в плане использования. По виду пришедшего запроса сразу можно определить, что он делает, не разбираясь в форматах (в отличие от SOAP, XML-RPC). Данные передаются без применения дополнительных слоев, поэтому REST считается менее ресурсоемким, поскольку не надо парсить запрос чтоб понять что он должен сделать и не надо переводить данные из одного формата в другой.
источник