Что такое ооп в java
Перейти к содержимому

Что такое ооп в java

  • автор:

Что такое ооп в java

6 сентября 2023

Скопировано

Объектно-ориентированное программирование (ООП) — это подход, при котором программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. Если постараться объяснить простыми словами, то ООП ускоряет написание кода и делает его более читаемым.

Освойте профессию
«Fullstack-разработчик на Python»

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

Зачем нужно ООП

До ООП в разработке использовался другой подход — процедурный. Программа представляется в нем как набор процедур и функций — подпрограмм, которые выполняют определенный блок кода с нужными входящими данными. Процедурное программирование хорошо подходит для легких программ без сложной структуры. Но если блоки кода большие, а функций сотни, придется редактировать каждую из них, продумывать новую логику. В результате может образоваться много плохо читаемого, перемешанного кода — «спагетти-кода» или «лапши».

ООП спагетти-код

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

Объектно-ориентированное программирование используется, чтобы:

  • структурировать информацию и не допускать путаницы;
  • точно определять взаимодействие одних элементов с другими;
  • повышать управляемость программы;
  • быстрее масштабировать код под различные задачи;
  • лучше понимать написанное;
  • эффективнее поддерживать готовые программы;
  • внедрять изменения без необходимости переписывать весь код.

Возможности ООП поддерживает большинство популярных языков программирования, включая JavaScript, PHP, Python и другие.

Читайте также Востребованные IT-профессии 2023 года: на кого учиться онлайн
Профессия / 12 месяцев
Fullstack-разработчик на Python

Создавайте веб-проекты самостоятельно

dffsdd (2)

Структура ООП

Объекты и классы

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

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

Понять, что такое ООП, поможет аналогия.

  • Понятие «программист» — это класс.
  • Конкретный разработчик по имени Иван — это объект, принадлежащий к классу «программист» (экземпляр класса).
  • Зарплата, рабочие обязанности, изученные технологии и должность в компании — это свойства, которые есть у всех объектов класса «программист», в том числе у Ивана. У разных объектов свойства различаются: зарплата и обязанности Ивана будут отличаться от таковых у другого разработчика Миши.

Атрибуты и методы

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

Объект, класс, атрибуты и методы в ООП

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

Принципы ООП

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

Абстракция

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

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

Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, причем им не обязательно знать, как именно объект устроен внутри.

Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке

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

Каждый объект — независимая структура. Все, что ему нужно для работы, уже есть у него внутри. Если он пользуется какой-то переменной, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код перепишут, логика работы не изменится.

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

Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.

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

Можно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы. Более общее понятие в таком случае становится «родителем», а более специфичное и подробное — «наследником».

Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.

В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.

У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».

Одиночное и множественное наследие в ООП

Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.

Полиморфизм

Одинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.

Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.

Преимущества ООП

Модульность

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

Гибкость

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

Экономия времени

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

Безопасность

Программу сложно сломать, так как инкапсулированный код недоступен извне.

Недостатки ООП

Сложный старт

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

Снижение производительности

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

Большой размер программы

Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный». Это происходит, потому что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте.

Fullstack-разработчик на Python

Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.

Что такое ооп в java

Созданная в 1995 году, Java вскоре «отметит» свое 30-летие. Это — целая эпоха для ІТ, и хотя отрасль развивается сверхбыстрыми темпами, универсальный адаптивный язык Java все еще остается популярным и востребованным. Учитывая огромное количество продуктов, написанных на Java, спрос на квалифицированных «джавистов» в ближайшей перспективе сохранится на стабильно высоком уровне.

Итак, если вы решили овладеть этим довольно непростым, но перспективным языком программирования, ловите пять базовых понятий, которые должен знать каждый начинающий. Помогает разобраться в теме Александр Семьянихин, Software Engineer в ЕРАМ.

Основные принципы ООП или объектно-ориентированного программирования — это лидер среди поисковых запросов начинающих разработчиков и альфа и омега языка программирования Java. Что это такое?

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

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

Это скрытие механизма реализации любого действия. Наиболее наглядный и понятный пример инкапсуляции — человеческое тело. Мы дышим, ходим, спим, едим, но какие именно процессы при этом протекают в организме и какие системы задействованы, мы не задумываемся (по крайней мере пока у нас все в порядке). То же происходит и в программировании.

Другой пример — бытовая техника. Пользователей в основном волнует, что они могут делать с тем или иным устройством, но то, как оно работает, остается скрытым от посторонних глаз.

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

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

Объект «человек» отличается от объектов «водитель» и «пешеход» состоянием «движение». Для того чтобы создать новый класс, не нужно создавать объект с нуля, достаточно унаследовать от объекта «человек» и добавить новое состояние.

То есть, благодаря наследованию, разработчики могут повторно использовать существующий код, видоизменяя его согласно актуальным потребностям.

Полиморфизм

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

Пример из практики: мы разработали решение для сети супермаркетов с представительствами в разных странах, в каждой из которых есть определенные законодательные требования и ограничения. Поэтому мы не можем предоставить унифицированный код. Мы должны модифицировать его в соответствии с требованиями локального законодательства. Здесь нам тоже пригодится принцип полиморфизма.

Класс и объект

В объектно-ориентированном языке программирования Java понятия «класс» и «объект» играют ключевую роль. Для того чтобы наглядно объяснить разницу между ними, вернемся к примеру со шкафом. Чертеж для сборки этого предмета интерьера — это класс, некая заготовка, с которой можно работать, а непосредственно шкаф — объект. По этому чертежу можно собрать розовый, белый или черный шкаф: класс определяет структуру и набор функций объекта.

Система контроля версий Git

Команды разработчиков используют системы контроля версий. Чаще всего — это Git. Для чего нужны такие системы? Они крайне необходимы в современных ІТ проектах, когда над программным решением могут одновременно работать сотни разработчиков. Git — это удобный, функциональный инструмент для совместного создания кода. Именно по этому на наших образовательных программах мы уделяем много внимания изучению Git.

Системы контроля версий страхуют от ошибок и дают возможность в случае ошибки вернуться к некой контрольной точке, в которой «все работало», с минимальными потерями функциональности кода. Еще одна важная функция Git — способность создавать ответвления от основной проектной ветки и работать, не мешая при этом другим участникам команды. Такие «ветки-ответвления» — это своеобразные черновики разработчиков, которые можно удалить после слияния с основной веткой проекта.

Важно не путать Git, систему контроля версий, и GitHub — онлайн репозиторий историй версий проектов. Git и GitHub часто используют как единый механизм для работы над проектами.

В EPAM мы предлагаем немало образовательных программ по направлению Java для кандидатов с разным уровнем подготовки. Посмотрите список открытых наборов и присоединяйтесь к нам!

Что такое ООП

ООП

Аббревиатура ООП расшифровывается как «Объектно-ориентированное программирование». Если Вы читали более ранние статьи из «Самоучителя по Java», то в общих чертах уже имеете о нем представление.

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

Что такое «объект»

Программирование — это вещь сложная сама по себе. Никто не стремится его усложнять, а наоборот — все сделано для того, чтобы работа шла легче и быстрее. ООП, с его объектами — это то, что было придумано для упрощения Вашей работы.

Работая ранее, Вы скорее всего пользовались Scanner для считывания символов, которые вводятся пользователем. Правда, удобно — две строчки, и готово? Вы объявляете Scanner:

Scanner scan = new Scanner ( System . in ) ;

создавая новый объект типа Scanner, и можете работать, задавая разные методы. Вам не важно, какая работа проходит внутри — главное Вы можете использовать этот метод снова и снова. Правда, удобно? ��

Что важно — в дальнейшем Вы сможете создавать собственные классы и объекты!

Наверняка, Scanner Вы использовали не один раз. Они имели разные параметры и названия- scan, sanner, sc или sc1. Это были разные объекты одного класса.

У каждого объекта есть свойства. Например, свойства машины: модель, цвет, размер и т.д.

У каждого объекта есть методы (то есть действия, которые может делать объект). Например, методы машины: затормозить, нажать на газ и т.д. Ниже приводим Вам слайд в помощь.

Можно сказать, что Ваш друг — объект класса «Человек», маленькая дворняжка или большой ротвеллер — объекты класса «Собака», с общими методами и свойствами, но разными индивидуальными параметрами.

Кроме базовых понятый «класса» и «объекта» рассмотрим основные принципы ООП — наследование, инкапсуляция, полиморфизм (запомните эти три слова — они наверняка пригодятся на интервью!).

Принцип 1. Наследование

На картинке: три поколения — бабушка, дочка и внучка.

Что же такое «наследование»?

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

Благодаря наследованию, можно не прописывать все методы и свойства класса заново. Можно просто указать, что класс «Котенок» наследует класс «Кошка», и добавить недостающие методы и параметры. Опять — удобно, правда? ��

Принцип 2. Инкапсуляция

«Инкапсуляция» можно расшифровать как «заключение в капсулу». Если проще — это «обеспечение безопасности» в Java.

Дело в том, что в каждой программе есть параметры, к которым нельзя давать доступ всем. Например, разве будет интересно играть в игру, если пользователь сможет свободно изменять свои очки сам? Инкапсуляция позволяет регулировать уровни доступа в программе.

Принцип 3. Полиморфизм

Это — «облегчитель работы №2«, или «зачем запоминать много методов если можно использовать только один». Смысл полиморфизма в том, что Вы можете давать одно и то же название для методов, которые имеют одинаковый смысл, но принимают разные типы данных. Хотя это может Вам показаться странным, но в других языках — где полиморфизма нет — нужно иногда запоминать названия 5 методов вместо одного — только из-за того, что они работают с разными типами данных.

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

Статья написана Vertex Academy. Будем рады видеть Вас на наших курсах Java с нуля.

  • ← Оператор switch
  • Геттеры и Сеттеры →

ООП в Java: четыре принципа с примерами

Объектно-ориентированное программирование (ООП) — это методология программирования с использованием объектов и классов.

Курс Комерційний директор.

Зосередження на практичних завданнях та послідовному аналізі проектів замість великої теорії. Реалізуй свої мрії про керівну посаду після завершення курсу.

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

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

В классах Java состояние представлено в виде полей, а поведение — в виде методов.

Принципы ООП

Объектно-ориентированное программирование опирается на четыре принципа:

Курс Англійської.
Обери викладача за своїми вимогами серед 1100+ фахівців в Englishdom.

  • Наследование — это передача всех свойств и поведения от одного класса другому, более конкретному. У карася и ерша, как и у всех рыб, есть плавники, хвосты, жабры и чешуя, они живут в воде и плавают.
  • Абстракция — это сокрытие подробностей и предоставление пользователю лишь самых важных характеристик объекта. Например, в адресе здания важны такие данные, как почтовый индекс, страна, населенный пункт, улица и номер дома. Его этажность и материал стен в таком случае не имеют значения.
  • Инкапсуляция — это размещение данных и методов для их обработки в одном объекте, а также сокрытие деталей его реализации. Мы знаем, как включать и выключать телевизор, переключать программы и регулировать громкость. Для этого не обязательно знать, как он устроен.
  • Полиморфизм — это проявление одного поведения разными способами. Животные могут издавать звуки, при этом кошка мяукает, а собака лает.

Рассмотрим эти принципы подробнее.

Чтобы полностью разобраться в особенностях языка Java, лучше всего записаться на специальные курсы. Наши друзья из Mate Academy и Hillel подготовили подробную программу курса, которая поможет с освоением языка. Практикующие менторы смогут ответить на любые вопросы.

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

Наследование позволяет использовать код повторно. Это достигается за счет того, что в одном классе содержатся свойства и методы, общие для более конкретных классов. Класс, от которого наследуются свойства и методы, называется суперклассом (родительским классом). Классы, которые наследуют их, называются подклассами (дочерними классами). Таким образом создается иерархия классов.

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

Создадим базовый класс Animal, который описывает животное.

Курс Управління командою в бізнесі.

Онлайн-курс для ефективного управління командою, спрямований на створення проактивних та самостійних команд, де мікроменеджмент не потрібний.

class Animal

Допустим, у животного есть имя и оно издает какой-то звук. Определим имя и звук как строковые поля.

class Animal

Ключевое слово private — это модификатор доступа, который означает, что поле будет доступно только в данном классе и его подклассах. Таким образом мы запрещаем изменение значений двух полей этого класса извне.

Чтобы создать экземпляр класса (объект) и задать начальные значения полей, объявим общедоступный конструктор, используя модификатор доступа public. Он позволит обращаться к конструктору извне.

class Animal < private String name; private String voice; public Animal(String name, String voice)< this.name = name; this.voice = voice; >>

Ключевое слово this — это ссылка на создаваемый объект. Для обращения к полю внутри объекта используется синтаксис:

this.

В этом конструкторе мы присваиваем полям объекта значения, переданные в формальных параметрах.

На данном этапе уже реализовано состояние объекта. Теперь реализуем его поведение.

class Animal < private String name; private String voice; public Animal(String name, String voice)< this.name = name; this.voice = voice; >public void speak() < System.out.println(this.name + " says " + this.voice); >>

Мы объявили общедоступный метод speak(), в котором на консоли выводится значение поля voice.

Создадим класс Cat, который будет представлять кота и унаследует от класса Animal его свойства и поведение. Для создания подкласса используется ключевое слово extends.

class Cat extends Animal < public Cat(String name)< super(name, "meow"); >>

Благодаря наследованию нам не пришлось еще раз писать код, чтобы дать коту имя и указать звук, который он издает. Имя конкретного кота мы заранее не знаем, но знаем, что коты мяукают. Поэтому конструктор этого класса принимает только один формальный параметр name.

Для обращения к суперклассу из подкласса используется ключевое слово super. В данном случае мы вызываем конструктор суперкласса и передаем ему формальный параметр name и литерал meow. Конструктор суперкласса присваивает унаследованным переменным объекта переданные значения.

Курс Стратегический маркетинг.

Від хаосу до системного маркетингу разом із Тетяною Лукинюк, B2C-директором у Kyivstar, колишнім CMO у Coca-Cola, Mars Ukraine та генеральною директоркою у Red Bull Ukraine.

Теперь мы можем создать экземпляр класса Cat и воспользоваться методом speak(), унаследованным от суперкласса, чтобы «услышать», как мяукает кот.

В языке Java все (точнее, почти все) является объектом. Поэтому мы создаем класс Main с методом main, в котором содержатся инструкции программы. В нем мы объявляем переменную класса Cat для создания объекта. Чтобы инициализировать его, обращаемся к конструктору, используя ключевое слово new, и задаем имя питомца:

public class Main < public static void main(String args[]) < Cat albatros = new Cat("Albatros"); albatros.speak(); >>

Полный код будет выглядеть так:

public class Main < public static void main(String args[]) < Cat albatros = new Cat("Albatros"); albatros.speak(); >> class Animal < private String name; private String voice; public Animal(String name, String voice)< this.name = name; this.voice = voice; >public void speak() < System.out.println(this.name + " says " + this.voice); >> class Cat extends Animal < public Cat(String name)< super(name, "meow"); >>

Абстракция

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

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

Создадим класс Person и определим в нем общие характеристики.

class Person < protected String firstName; protected String lastName; protected String address; public Person(String firstName, String lastName, String address)< this.firstName = firstName; this.lastName = lastName; this.address = address; >public void display() < System.out.println(this.firstName + " " + this.lastName); System.out.println("Address: " + this.address); >>

Унаследуем от него классы Customer и Employee. Добавим для клиента номер банковского счета, а для сотрудника — размер зарплаты.

class Customer extends Person < private String bankAccountNumber; public Customer(String firstName, String lastName, String address, String bankAccountNumber) < super(firstName, lastName, address); this.bankAccountNumber = bankAccountNumber; >@Override public void display() < super.display(); System.out.println("Bank account number: " + this.bankAccountNumber); >> class Employee extends Person < private double salary; public Employee(String firstName, String lastName, String address, double salary) < super(firstName, lastName, address); this.salary = salary; >@Override public void display() < super.display(); System.out.println("Salary: " + this.salary); >>

Так, мы избавились от повторного написания кода, выделив общие признаки в суперкласс. Рабочий пример выглядит так:

public class Main < public static void main(String args[]) < Customer henry = new Customer("Henry", "Baskerville", "Baskerville Hall", "GB29 NWBK 6016 1331 9268 19"); Employee sherlock = new Employee("Sherlock", "Holmes", "221b Baker St", 61632); henry.display(); System.out.println(""); sherlock.display(); >> class Person < protected String firstName; protected String lastName; protected String address; public Person(String firstName, String lastName, String address)< this.firstName = firstName; this.lastName = lastName; this.address = address; >public void display() < System.out.println(this.firstName + " " + this.lastName); System.out.println("Address: " + this.address); >> class Customer extends Person < private String bankAccountNumber; public Customer(String firstName, String lastName, String address, String bankAccountNumber) < super(firstName, lastName, address); this.bankAccountNumber = bankAccountNumber; >@Override public void display() < super.display(); System.out.println("Bank account number: " + this.bankAccountNumber); >> class Employee extends Person < private double salary; public Employee(String firstName, String lastName, String address, double salary) < super(firstName, lastName, address); this.salary = salary; >@Override public void display() < super.display(); System.out.println("Salary: " + this.salary); >>

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

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

Площадь прямоугольника равна произведению длин его сторон. Площадь треугольника по сторонам можно вычислить по формуле Герона. Создадим абстрактный класс Area, который будет представлять геометрическую фигуру.

abstract class Shape

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

Создадим производные классы Rectangle и Triangle.

class Rectangle extends Shape < private final double width, length; public Rectangle(double width, double length) < this.width = width; this.length = length; >@Override public double area() < return width * length; >> class Triangle extends Shape < private final double a, b, c; public Triangle(double a, double b, double c) < this.a = a; this.b = b; this.c = c; >@Override public double area() < double halfPerimeter = (this.a + this.b + this.c) / 2; return Math.sqrt(halfPerimeter * (halfPerimeter - this.a) * (halfPerimeter - this.b) * (halfPerimeter - this.c)); >>

В этих классах объявлены стороны и переопределен унаследованный метод area().

Стороны объявлены с использованием модификатора final, который означает, что значение данного поля — это константа, и поэтому не может быть изменено во время выполнения программы. Если объявить класс как final, то он не сможет иметь подклассов.

Подклассы могут переопределять методы суперкласса с использованием аннотации @Override. Как видим, в переопределенных методах, в отличие от абстрактного, содержится код вычисления площади.

Для вычисления площади треугольника мы используем статический метод sqrt() класса Math. Чтобы воспользоваться таким методом в программе, его нужно импортировать:

import java.lang.Math;

Полный код будет выглядеть так:

import java.lang.Math; public class Main < public static void main(String args[]) < Rectangle r = new Rectangle(5, 10); Triangle t = new Triangle(10, 10, 10); System.out.println("Square of the rectangle is " + r.area()); System.out.println("Square of the triangle is " + t.area()); >> abstract class Shape < public abstract double area(); >class Rectangle extends Shape < private final double width, length; public Rectangle(double width, double length) < this.width = width; this.length = length; >@Override public double area() < return width * length; >> class Triangle extends Shape < private final double a, b, c; public Triangle(double a, double b, double c) < this.a = a; this.b = b; this.c = c; >@Override public double area() < double halfPerimeter = (this.a + this.b + this.c) / 2; return Math.sqrt(halfPerimeter * (halfPerimeter - this.a) * (halfPerimeter - this.b) * (halfPerimeter - this.c)); >>

Хоть площадь этих фигур определяется по разным формулам, мы просто вызываем метод area(), не заботясь о том, как производятся вычисления.

Полиморфизм

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

Рассмотрим полный пример кода:

import java.util.List; import java.util.Arrays; public class Main < public static void main(String args[]) < Guitarist ritchie = new Guitarist("Ritchie"); Keyboardist john = new Keyboardist("John"); Musician david = new Musician("David"); Listmusicians = Arrays.asList(ritchie, john, david); for (Musician m : musicians) < m.play(); >> > class Musician < protected String name; public void play()< System.out.println(this.name + " plays anything he sees."); >public Musician(String name) < this.name = name; >> class Guitarist extends Musician < public Guitarist(String name) < super(name); >@Override public void play() < System.out.println(this.name + " plays a guitar."); >> class Keyboardist extends Musician < public Keyboardist(String name) < super(name); >@Override public void play() < System.out.println(this.name + " plays a piano."); >>

Обратите внимание, что в определении суперкласса мы используем модификатор protected для поля name. Этот модификатор позволяет обращаться к нему не только из данного класса, но и из его подклассов. Прямой доступ извне по-прежнему закрыт.

В методе Main мы создаем список объектов класса Musician, в котором могут находиться и экземпляры унаследованных от него классов:

List musicians = Arrays.asList(ritchie, john);

Затем в цикле мы перечисляем музыкантов и вызываем для каждого из них метод play(). Поскольку этот метод реализован во всех классах, не приходится заботиться о том, на чем именно играет каждый музыкант, и писать код вызова метода для каждого из них отдельно.

Причины появления ООП

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

Объектно-ориентированное программирование было создано как ответ на эти трудности. Оно позволило объединить связанные участки кода и отделить их от тех участков, с которыми они были связаны слабо.

В результате вместо огромного количества процедур и переменных требовалось помнить лишь те, которые нужны для применения объекта (интерфейс). Остальная часть его реализации была скрыта.

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

ООП упрощает понимание кода и позволяет экономить много времени при его написании.

Курс QA Manual.

Успішна кар’єра в IT-сфері без необхідності глибоких знань програмування. Очікуйте заробітню плату в розмірі 600$ після завершення навчання.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *