Функциональное программирование - это стиль написания программы, при котором мы позволяем себе создавать новые данные на основе имеющихся, но запрещаем себе изменять уже существующие данные. Таким образом мы стремимся к идеальному (недостижимому практически) положению, когда решение нашей задачи - это одна большая математическая функция, которой мы даём данные на вход, и она выдаёт данные на выходе.
Объектно-ориентированное программирование - это стиль архитектуры приложения, в котором мы представляем себе решение задачи в виде взаимодействия "объектов" друг с другом. Где каждый "объект" выполняет какую-то свою определённую функцию и обладает своим собственным внутренним состоянием, которое скрыто от стороннего наблюдателя. ООП подразумевает, что мы будем менять внутреннее состояние объектов, но это не обязательно, то есть, вообще говоря, мы можем сохранять требования функционального стиля программирования в объектно-ориентированной архитектуре.
Классическая книга по ООП -
Object-Oriented Software Construction Мейера. Учитывая количество дезинформации и глупостей вокруг ООП, если ваш курс/книга/видео не ссылается на эту книгу, они скорее всего несут ерунду.