JavaRush /Курсы /Java Syntax Pro /Объектно-Ориентированное Программирование

Объектно-Ориентированное Программирование

Java Syntax Pro
7 уровень , 4 лекция
Открыта

1. Знакомство с принципами ООП

Сегодня вы откроете для себя новый и интересный мир. Этот мир называется ООПобъектно-ориентированное программирование. Ранее вы уже познакомились с классами и объектами. Сегодня вы узнаете о них еще больше, намного больше.

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

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

Опробовали много подходов, и на основе лучших практик сформулировали 4 принципа ООП. Это: абстракция, инкапсуляция, наследование и полиморфизм. Раньше их было только три, но потом решили добавить еще и абстракцию.


2. Абстракция

В рунете народ до сих пор спорит над определением абстракции в ООП. И проблема даже не в том, что все неправы, а в том, что все правы. Чем программа меньше, тем сильнее абстракция привязана к языку Java, чем больше, тем сильнее привязана к моделированию/упрощению объектов реального мира.

Но вроде бы лучшие умы сошлись на том, что:

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

В языке программирования Java абстракция осуществляется через использование абстрактных классов и интерфейсов.

Абстракция в реальной жизни

Хороший пример абстракции в реальной жизни — описание должностей в компании или организации. Название должности — это одно, а обязанности каждой конкретной должности — это уже совсем другое.

Представьте, что вы проектируете структуру своей будущей компании. Вы можете разделить обязанности секретаря: «разбросать» их по нескольким другим должностям. Можете разбить должность исполнительного директора на несколько независимых должностей: финансовый директор, технический директор, директор по маркетингу, директор по персоналу. Или, например, объединить должности офис-менеджера и рекрутера в одну.

Вы придумываете названия должностей в своей фирме, а потом «разбрасываете» обязанности по этим должностям. Абстракция – отвлечение от целостности объекта и выделение его главных свойств и составляющих, нужных нам.

Знакомство с принципами ООП. Абстракция

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


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

Цель инкапсуляции — улучшить качество взаимодействия вещей за счет их упрощения.

Знакомство с принципами ООП.Инкапсуляция

А лучший способ упростить что-то — скрыть все сложное от посторонних глаз. Например, если вас посадят в кабину Боинга, вы не сразу разберетесь, как им управлять:

Знакомство с принципами ООП.Инкапсуляция

С другой стороны, для пассажиров самолета все выглядит проще: купил билет, сел в самолет, взлетели и приземлились. Вы можете с легкостью перелететь с континента на континент, обладая только навыками «купить билет» и «сесть на самолет». Все сложности в виде подготовки самолета к полету, взлета, посадки и различных внештатных ситуаций скрыты от вас. Не говоря уже о спутниковой навигации, автопилоте и диспетчерских центрах в аэропортах. И это упрощает нам жизнь.

С точки зрения программирования, инкапсуляция — это «сокрытие реализации». Мне нравится такое определение. Наш класс может содержать сотни методов и реализовывать очень сложное поведение в различных ситуациях. Но мы можем скрыть от посторонних глаз все его методы (пометить модификатором private), а для взаимодействия с другими классами оставить всего пару-тройку методов (пометить их модификатором public). Тогда все остальные классы нашей программы будут видеть в этом классе всего три метода и вызывать именно их. А все сложности будут скрыты внутри класса, как кабина пилотов от счастливых пассажиров.


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

У наследования есть две стороны. Сторона программирования и сторона реальной жизни. С точки зрения программирования, наследование — это специальное отношение между двумя классами. Но гораздо интереснее, что же такое наследование с точки зрения реальной жизни.

Если нам понадобится что-то создать в реальной жизни, у нас есть два решения:

  1. Создать нужную нам вещь с нуля, потратив кучу времени и сил.
  2. Создать нужную нам вещь на основе уже существующей.

Наиболее оптимальная стратегия выглядит так: берем существующее хорошее решение, немного его дорабатываем, подгоняем под свои нужды и используем.

Если мы проследим историю возникновения человека, то окажется, что с момента зарождения жизни на планете прошли миллиарды лет. А если представить, что человек возник из обезьяны (на основе обезьяны), то прошла всего пара миллионов лет. Создание с нуля — дольше. Гораздо дольше.

В программировании тоже есть возможность создавать один класс на основе другого. Новый класс становится потомком (наследником) уже существующего. Это очень выгодно, когда есть класс, который содержит 80%-90% нужных нам данных и методов. Мы просто объявляем подходящий класс родителем нашего нового класса, и в новом классе автоматически появляются все данные и методы класса-родителя. Правда, удобно?


5. Полиморфизм

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

Если человек может управлять грузовиком, его можно посадить и за руль скорой, и за руль спорткара. Человек может управлять машиной вне зависимости от того, что это за машина, потому что все они имеют одинаковый интерфейс управления: руль, педали и рычаг коробки передач. Внутреннее устройство машин разное, но все они имеют одинаковый интерфейс управления.

Если вернуться к программированию, то полиморфизм позволяет единообразно обращаться к объектам различных классов (обычно имеющих общего предка) — вещь, которую трудно переоценить. Ценность его тем выше, чем больше программа.

ООП — это принципы. Внутренние законы. Каждый из них нас в чем-то ограничивает, давая взамен большие преимущества, когда программа вырастает до больших размеров. Четыре принципа ООП — это как четыре ножки стула. Убери хотя бы одну, и вся система станет неустойчивой.



Комментарии (281)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анна Sowa Уровень 13
31 августа 2026
"А если представить, что человек возник из обезьяны (на основе обезьяны)" Точнее, от общего с обезьяной предка 😄
Магомед Уровень 9
15 марта 2026
то есть простыми словами абстракция -- упрощает ( те же педали автомобиля, систему упростили до простого нажатия). а инкапсуляция скрывает ( тот же мотор который не упростили , а скрыли) . То есть то ,что должно выполнять функцию напрямую мы не можем инкапсулировать ведь как мы полностью уберем педаль на нее должны нажать для функционирования, мотор не нужен он сам работает когда включено зажигание поэтому его скрываем . Есть сложный механизм его упрощают в одно действие -- например нажатие, но раз мы его упростили зачем нам все остальное мы его закрываем . как аппарат кофемашины вначале упростили до нажатия ( абстракция) на кнопку потом просто сверху покрыли каркасом и защитили и скрыли(инкапсуляция) . хотя я абстракция и инкапсуляция идут бок о бок, инкапсуляция не может существовать без абстракции, а абстракция без инкапсуляции может существовать (машина без каркаса, все будет работать также педаль, зажигание, сигнал но не инкапсулировано ) Ещё один простой пример - лампочка можно включать лампочку непосредственно саму , а можно упростить или абстрагировать ее использование -- протянем провода и сделаем включатель ( это была абстракция) дальше сделаем инкапсуляцию ( само слово содержит ответ "капсула") закроем все эти идущие провода . Инкапсуляция и абстракция сильно связаны как и наследование и полиморфизм это лучше спросить у нейросети из лекции я почти ничего не понял , к сожалению здесь очень поверхностно описали эти важные принципы , есть такое ощущение, что их нужно очень хорошо знать и понимать как использовать
Магомед Уровень 9
15 марта 2026
то есть простыми словами абстракция -- упрощает ( те же педали автомобиля, систему упростили до простого нажатия). а инкапсуляция скрывает ( тот же мотор который не упростили , а скрыли) . То есть то ,что должно выполнять функцию напрямую мы не можем инкапсулировать ведь как мы полностью уберем педаль на нее должны нажать для функционирования, мотор не нужен он сам работает когда включено зажигание поэтому его скрываем . Есть сложный механизм его упрощают в одно действие -- например нажатие, но раз мы его упростили зачем нам все остальное мы его закрываем . как аппарат кофемашины вначале упростили до нажатия ( абстракция) на кнопку потом просто сверху покрыли каркасом и защитили и скрыли(инкапсуляция) . хотя я абстракция и инкапсуляция идут бок о бок, инкапсуляция не может существовать без абстракции, а абстракция без инкапсуляции может существовать (машина без каркаса, все будет работать также педаль, зажигание, сигнал но не инкапсулировано ) Ещё один простой пример - лампочка можно включать лампочку непосредственно саму , а можно упростить или абстрагировать ее использование -- протянем провода и сделаем включатель ( это была абстракция) дальше сделаем инкапсуляцию ( само слово содержит ответ "капсула") закроем все эти идущие провода . Инкапсуляция и абстракция сильно связаны как и наследование и полиморфизм это лучше спросить у нейросети из лекции я почти ничего не понял , к сожалению здесь очень поверхностно описали эти важные принципы , есть такое ощущение, что их нужно очень хорошо знать и понимать как использовать
Валерка Ферум Уровень 32
21 февраля 2026
Костыльно Ориентированное Программирование. Стоит на трёх китах: 1. Костылирование 2. Инкостыляция 3. Поликостылизм 1) Костылирование — это создание костылей, позволяющее описать новый костыль на основе уже существующего с частично или полностью заимствующимися ошибками. Костыль, от которого производится наследование, называется базовым, родительским или суперкостылем. Новый костыль — потомком, наследником или производным. 2) Инкостыляция — это свойство костылей, позволяющее объединить фиксы и заплатки, работающие с ними в классе, и скрыть детали реализации от понимания. 3) Поликостылизм — это свойство разработчиков использовать костыли с одинаковым интерфейсом без информации о типе и внутренней структуре костыля.
Nemo Уровень 37
23 марта 2026
аххаха легенда!!
Vlad Уровень 29
30 октября 2025
Такое ощущение что я до сих пор пытаюсь управлять самолетом через бензобак с велосипедными педалями. Где у этого курса находится руль то?
Evgenii Petrov Уровень 1
25 октября 2025
А по- моему - очень интересно написано! даже начал придумывать примеры из реальной жизни наследования
Ivan Sinitsyn Уровень 1
11 октября 2025
Полиморфизм — это понятие из области программирования. Статью будто гпт писал. Серьезно? Понятие из области программирования? А откуда еще...мы ведь все собрались на сайте для программистов....
Dthmth Уровень 11
30 октября 2025
кажется когда этот курс создавался, никто даже не думал что ГПТ возможен
Grigoryvvv Уровень 26 Expert
3 октября 2025
03.10.2025 / 8 уровень
Руслан Уровень 48
11 июля 2025
инкапсуляция это возможность пользоваться данными не напрямую а через геттеры и сеттеры абстрация это возможность пользоваться методами но не знать что у них под капотом наследование это возможность пользоваться методами и полями предка полиморфизм это когда во всех классах есть одинаковые методы но реализация разная Вот ребят так станет понятно всем
StaryHroft Уровень 51
29 июня 2025
Доброго времени суток всем. когда первый раз проходил квест(Синтакс), было очень многое не понятно, т.к. это было первое знакомство с программированием в целом, тем более с Джавой. в лучшем случае понимал что надо сделать в конкретной задаче в 50-60% случаев, а решить, соответственно, получалось без чтения форума и поиска в интернете в 50-60% задач от понятых условий (т.е. в 50-60% от 50-60%) и по-хорошему это четверть!!!! Четверть от всего квеста. это, мягко говоря, снижало самооценку, приводило к лишнему(как я сейчас понимаю) самокопанию и размышлениям типа: "Ну я и тупой... Ё маё... как так-то, а остальные как??? Как это все проходят???" Но прошел Синтакс. В итоге получил чувство незавершенности и тщетности попытки реализоваться в новом деле. Но решил не начиная новый квест, пройти Синтакс заново. И вот после месячного перерыва я начал повторное восхождение к вершинам ДЖАВЫ))) В результате сам себе чуть не выпал в осадок...))) Условия задач стали понятнее (но только чуть-чуть) а вот решения стали находиться гораздо проще. Пришло понимание, что все-таки есть у меня прогресс в этом не легком деле, т.е. усилия затрачены не в пустую. поэтому всем желаю не сдаваться и не отступать, все получится. П.С. из текущей лекции не увидел принципиальной разницы между абстракцией и инкапсуляцией. Но один из ИИ мне расписал так отличия, может кому пригодится Главные отличия Абстракция: Упрощает использование объекта, Скрывает сложную логику, реализуется Абстрактными классами/интерфейсами - Пульт от телевизора Инкапсуляция: Защищает данные от некорректного доступа, Скрывает данные (поля класса), реализуется private-полями + геттерами/сеттерами - Банковская карта Вывод Абстракция — про удобство: "Покажи мне только кнопки, а как оно работает внутри — неважно". Инкапсуляция — про безопасность: "Не трогай переменные руками, используй методы!". Оба принципа делают код чище, надёжнее и удобнее!
Anonymous #3322195 Уровень 9
3 июля 2025
Мне видится, что инкапсуляция - это просто частная форма абстракции. А абстракция в целом имеет и другие направления понимания - к примеру, формирование структуры программы и выделение характеристик, которые мы обернем в переменные, объектов, которые будут включать эти переменные, организация связей между этими объектами и т д. Поправьте, если вдруг в чем-то не права)