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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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



Комментарии (276)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vlad Уровень 14
30 октября 2025
Такое ощущение что я до сих пор пытаюсь управлять самолетом через бензобак с велосипедными педалями. Где у этого курса находится руль то?
Evgenii Petrov Уровень 10
25 октября 2025
А по- моему - очень интересно написано! даже начал придумывать примеры из реальной жизни наследования
Ivan Sinitsyn Уровень 1
11 октября 2025
Полиморфизм — это понятие из области программирования. Статью будто гпт писал. Серьезно? Понятие из области программирования? А откуда еще...мы ведь все собрались на сайте для программистов....
Dthmth Уровень 11
30 октября 2025
кажется когда этот курс создавался, никто даже не думал что ГПТ возможен
Grigoryvvv Уровень 13 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
Мне видится, что инкапсуляция - это просто частная форма абстракции. А абстракция в целом имеет и другие направления понимания - к примеру, формирование структуры программы и выделение характеристик, которые мы обернем в переменные, объектов, которые будут включать эти переменные, организация связей между этими объектами и т д. Поправьте, если вдруг в чем-то не права)
Anonymous #3585174 Уровень 33
8 июня 2025
like
Apsel Уровень 13
29 мая 2025
Какие страшные слова.
Олег Сычев Уровень 12
27 апреля 2025
То что любопытно, на собесах и в статьях, что Я ранее читал - всегда говорилось именно о трех принципах ООП - инкапсуляция, наследование и полиморфизм. Про то, что еще четвертый есть - абстракция, честно говоря, впервые прочитал. Что-то новое)
Слава Уровень 9
4 апреля 2025
Понравилась фраза - если вас посадят в кабину Боинга, вы не сразу разберетесь как им управлять... не сразу.