Спорный вопрос. Многие разделяют языки на эти типы, а многие видят в каждом языке элементы этих типов.
Императивный - объясняешь как получить. Поезжай прямо, на право, на лево...
C, C++, Java, Python etc.
Декларативный - объясняешь что нужно. Адрес ул. Центральная 1.
SQL, HTML, Prolog, R etc.
ООП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования. (способ программирования, путем приравнивания частей кода с объектами из реального мира).
Абстракция - означает построение классов исходя от их интерфейсов, и несмотря на их реализацию.
Наследование - процесс при котором один класс получает поля и методы другого. Для переиспользования уже написанного кода.
Полиморфизм - один интерфейс - много реализаций. Интерфейс представляет контракт, который обязан быть реализован. Бывает:
Инкапсуляция - сокрытие реализации. В Java регулируется при помощи модификаторов доступа. Все переменные должны быть private и доступ к ним должен осуществляться через set и get.
Функциональное программирование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). На практике отличие математической функции от понятия «функции» в императивном программировании заключается в том, что императивные функции могут опираться не только на аргументы, но и на состояние внешних по отношению к функции переменных, а также иметь побочные эффекты и менять состояние внешних переменных. Таким образом, в императивном программировании при вызове одной и той же функции с одинаковыми параметрами, но на разных этапах выполнения алгоритма, можно получить разные данные на выходе из-за влияния на функцию состояния переменных. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных. Это позволяет средам выполнения программ на функциональных языках кешировать результаты функций и вызывать их в порядке, не определяемом алгоритмом и распараллеливать их без каких-либо дополнительных действий со стороны программиста.
Концепции которые использует функционального программирования.
Функция высшего порядка(Higher-order function) - функция/метод которая принимающая в качестве аргументов другие функции или возвращающая другую функцию в качестве результата. Также в нее можно передать метод. Функции высших порядков позволяют использовать карринг.
Чистые функции - функции, которые не имеют побочных эффектов(side effects) ввода-вывода и памяти.