Что такое ооп в java
6 сентября 2023
Скопировано
Объектно-ориентированное программирование (ООП) — это подход, при котором программа рассматривается как набор объектов, взаимодействующих друг с другом. У каждого есть свойства и поведение. Если постараться объяснить простыми словами, то ООП ускоряет написание кода и делает его более читаемым.
Освойте профессию
«Fullstack-разработчик на Python»
Идеология объектно-ориентированного программирования (ООП) разрабатывалась, чтобы связать поведение определенного объекта с его классом. Людям проще воспринимать окружающий мир как объекты, которые поддаются определенной классификации (например, разделение на живую и неживую природу).
Зачем нужно ООП
До ООП в разработке использовался другой подход — процедурный. Программа представляется в нем как набор процедур и функций — подпрограмм, которые выполняют определенный блок кода с нужными входящими данными. Процедурное программирование хорошо подходит для легких программ без сложной структуры. Но если блоки кода большие, а функций сотни, придется редактировать каждую из них, продумывать новую логику. В результате может образоваться много плохо читаемого, перемешанного кода — «спагетти-кода» или «лапши».
В отличие от процедурного, объектно-ориентированное программирование позволяет вносить изменения один раз — в объект. Именно он — ключевой элемент программы. Все операции представляются как взаимодействие между объектами. При этом код более читаемый и понятный, программа проще масштабируется.
Объектно-ориентированное программирование используется, чтобы:
- структурировать информацию и не допускать путаницы;
- точно определять взаимодействие одних элементов с другими;
- повышать управляемость программы;
- быстрее масштабировать код под различные задачи;
- лучше понимать написанное;
- эффективнее поддерживать готовые программы;
- внедрять изменения без необходимости переписывать весь код.
Возможности ООП поддерживает большинство популярных языков программирования, включая JavaScript, PHP, Python и другие.
Читайте также Востребованные IT-профессии 2023 года: на кого учиться онлайн
Профессия / 12 месяцев
Fullstack-разработчик на Python
Создавайте веб-проекты самостоятельно
Структура ООП
Объекты и классы
Чтобы сделать код проще, программу разбивают на независимые блоки — объекты. В реальной жизни это может быть стол, чашка, человек, книга, здание и многое другое. В программировании объекты — это структуры данных: пользователь, кнопка, сообщение. У них, как и у реальных предметов, могут быть свойства: цвет, содержание или имя пользователя. А чтобы объединить между собой объекты с похожими свойствами, существуют классы.
Класс — это «шаблон» для объекта, который описывает его свойства. Несколько похожих между собой объектов, например профили разных пользователей, будут иметь одинаковую структуру, а значит, принадлежать к одному классу. Каждый объект — это экземпляр какого-нибудь класса.
Понять, что такое ООП, поможет аналогия.
- Понятие «программист» — это класс.
- Конкретный разработчик по имени Иван — это объект, принадлежащий к классу «программист» (экземпляр класса).
- Зарплата, рабочие обязанности, изученные технологии и должность в компании — это свойства, которые есть у всех объектов класса «программист», в том числе у Ивана. У разных объектов свойства различаются: зарплата и обязанности Ивана будут отличаться от таковых у другого разработчика Миши.
Атрибуты и методы
Объект — это набор переменных и функций, как в традиционном функциональном программировании. Переменные и функции и есть его свойства.
Атрибуты — это переменные, конкретные характеристики объекта, такие как цвет поля или имя пользователя. Методы — это функции, которые описаны внутри объекта или класса. Они относятся к определенному объекту и позволяют взаимодействовать с ними или другими частями кода.
Принципы ООП
Объектно-ориентированное программирование определяют через четыре принципа, по которым можно понять основы работы. Иногда количество сокращают до трех — опускают понятие абстракции.
Абстракция
Абстрагирование — это способ выделить набор наиболее важных атрибутов и методов и исключить незначимые. Соответственно, абстракция — это использование всех таких характеристик для описания объекта. Важно представить объект минимальным набором полей и методов без ущерба для решаемой задачи.
Пример: объекту класса «программист» вряд ли понадобятся свойства «умение готовить еду» или «любимый цвет». Они не влияют на его особенности как программиста. А вот «основной язык программирования» и «рабочие навыки» — важные свойства, без которых программиста не опишешь.
Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, причем им не обязательно знать, как именно объект устроен внутри.
Станьте Fullstack-разработчик на Python и найдите стабильную работу
на удаленке
Инкапсуляция
Каждый объект — независимая структура. Все, что ему нужно для работы, уже есть у него внутри. Если он пользуется какой-то переменной, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код перепишут, логика работы не изменится.
Инкапсуляция помогает с легкостью управлять кодом. Выше мы сказали, что для обращения к объекту не нужно понимать, как работают его методы. Начальнику разработчика Ивана не обязательно знать, как именно он программирует: главное — чтобы выполнялись поставленные задачи.
Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.
Наследование
Можно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы. Более общее понятие в таком случае становится «родителем», а более специфичное и подробное — «наследником».
Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.
В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.
У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».
Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.
Полиморфизм
Одинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.
Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.
Преимущества ООП
Модульность
Объектно-ориентированный подход позволяет сделать код более структурированным, в нем легко разобраться стороннему человеку. Благодаря инкапсуляции объектов уменьшается количество ошибок и ускоряется разработка с участием большого количества программистов, потому что каждый может работать независимо друг от друга.
Гибкость
ООП-код легко развивать, дополнять и изменять. Это обеспечивает независимая модульная структура. Взаимодействие с объектами, а не логикой упрощает понимание кода. Для модификации не нужно погружаться в то, как построено ПО. Благодаря полиморфизму можно быстро адаптировать код под требования задачи, не описывая новые объекты и функции.
Экономия времени
Благодаря абстракции, полиморфизму и наследованию можно не писать один и тот же код много раз. Это ускоряет разработку нового ПО. Интерфейсы и классы в ООП могут легко преобразовываться в подобие библиотек, которые можно использовать заново в новых проектах. Также ООП экономит время при поддержке и доработке приложения.
Безопасность
Программу сложно сломать, так как инкапсулированный код недоступен извне.
Недостатки ООП
Сложный старт
Чтобы пользоваться ООП, нужно сначала изучить теорию и освоить процедурный подход, поэтому порог входа высокий.
Снижение производительности
Объектно-ориентированный подход немного снижает производительность кода в целом. Программы работают несколько медленнее из-за особенностей доступа к данным и большого количества сущностей.
Большой размер программы
Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный». Это происходит, потому что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте.
Fullstack-разработчик на Python
Fullstack-разработчики могут в одиночку сделать IT-проект от архитектуры до интерфейса. Их навыки востребованы у работодателей, особенно в стартапах. Научитесь программировать на Python и JavaScript и создавайте сервисы с нуля.
Как работают принципы ООП в Java: примеры
Принципы и понятия объектно-ориентированного программирования (ООП, или OOPS, Object-Oriented Programming Concepts) очень важны. Не разбираясь в понятиях ООП, вы не сможете проектировать системы в модели объектно-ориентированного программирования.
Модель объектно-ориентированного программирования
Модель объектно-ориентированного программирования построена вокруг понятия объекта. Объект – это экземпляр класса. Он содержит свойства и функции. По сути они похожи на объекты реального мира: как, например, машина, дом, ноутбук и т. д. У них есть свои свойства и определенные методы для выполнения действий. Что такое класс? Класс определяет схему объектов. Он определяет свойства и функции объектов. К примеру, книга — это класс, а конкретно ваша книга — его экземпляр.
Принципы ООП
Основными принципами ООП являются:
- Абстракция
- Инкапсуляция
- Полиморфизм
- Наследование
- Ассоциация и агрегация
- Композиция
Теперь по порядку рассмотрим эти понятия объектно-ориентированного программирования. Чтобы вы лучше поняли, как реализовать концепции ООП, мы будем использовать фрагменты кода на языке программирования Java.
Абстракция
Абстракция — это скрытие внутренних деталей и описание вещей простыми терминами. Возьмем, к примеру, метод, который складывает два целых числа . Внутренняя обработка метода скрыта от внешнего мира. Достичь абстракци в ООП можно несколькими способами, например, через инкапсуляцию и наследование. Отличным примером абстракции является программа на Java: язык программирования сам заботится о преобразовании простых операторов в машинный язык и скрывает детали внутренней реализации от внешнего мира.
Инкапсуляция
Инкапсуляция — это метод, используемый для реализации абстракции в ООП. Она ограничивает доступ к членам и методам класса. Для инкапсуляции в ООП применяются ключи модификаторов доступа. Например, в языке java инкапсуляция достигается с помощью ключевых слов private, protected и public.
Полиморфизм
Полиморфизм указывает, что в разных ситуациях объект ведет себя по-разному. Существует два типа полиморфизма – полиморфизм во время компиляции и во время выполнения. Полиморфизм во время компиляции достигается перегрузкой метода.
Для примера рассмотрим такой класс:
public class Circle public void draw() System.out.println("Drwaing circle with default color Black and diameter 1 cm."); > public void draw(int diameter) System.out.println("Drwaing circle with default color Black and diameter"+diameter+" cm."); > public void draw(int diameter, String color) System.out.println("Drwaing circle with color"+color+" and diameter"+diameter+" cm."); > >
Все методы draw, которые встречаются в этом коде, ведут себя по-разному. Это пример перегрузки метода, потому что имена методов одинаковы, а аргументы разные. Поскольку компилятор сможет определить метод вызова во время компиляции, данный метод называется полиморфизмом во время компиляции. Полиморфизм во времени выполнения реализуется, когда между объектами есть отношения наследования «IS-A». Также этот подход называется переопределением метода, поскольку подкласс должен переопределить метод суперкласса. Фактический класс определяется во время выполнения с точки зрения суперкласса. Компилятор не может решать, какой метод класса будет вызван. Это решение принимается во время выполнения, отсюда и название – «полиморфизм во время выполнения» или «динамическая диспетчеризация методов».
package com.journaldev.test; public interface Shape public void draw(); > package com.journaldev.test; public class Circle implements Shape @Override public void draw() System.out.println("Drwaing circle"); > > package com.journaldev.test; public class Square implements Shape @Override public void draw() System.out.println("Drawing Square"); > >
Тут Shape — это суперкласс, у которого есть два подкласса, Circle и Square. Ниже приведен пример полиморфизма во время выполнения.
Shape sh = new Circle(); sh.draw(); Shape sh1 = getShape(); //some third party logic to determine shape sh1.draw();
В этих примерах компилятор Java не знает фактического класса реализации Shape, который будет использоваться во время выполнения.
Наследование
Наследование — это понятие объектно-ориентированного программирования, которое указывает, что один объект основан на другом объекте, вытекает из него. Проще говоря, наследование — это механизм повторного использования кода. Наследуемый объект называется суперклассом, а объект, который наследует суперкласс, называется подклассом. В java для реализации наследования используется ключевое слово extends. Давайте посмотрим на следующий пример наследования в java.
package com.journaldev.java.examples1; class SuperClassA public void foo() System.out.println("SuperClassA"); > > class SubClassB extends SuperClassA public void bar() System.out.println("SubClassB"); > > public class Test public static void main(String args[]) SubClassB a = new SubClassB(); a.foo(); a.bar(); > >
Ассоциация
Такое поняте ООП, как ассоциация, определяет связи между объектами, а также разнообразие самих объектов. Предположим, что у нас есть объекты “Учитель” и “Ученик”: множество учеников может общаться с одним учителем, и, конечно, один ученик также может общаться с несколькими учителями.
Агрегация
Агрегация – это особый тип ассоциации. Это понятие подразумевает, что все объекты имеют свой собственный жизненный цикл, но со взаимосвязью «HAS-A» – то есть один дочерний объект может принадлежать одному родительскому . Каждый раз, когда вы встречаете взаимосвязь «HAS-A» между объектами, знайте – это называется агрегацией.
Композиция
Композиция – специальная “ограничительная” форма агрегации. В композиции содержащийся в отношении «HAS-A» объект не может существовать сам по себе. Представим, например, комнату, которая находится в доме . Одна комната не может быть частью двух разных домов. Конечно, если вы удалите дом, комната тоже будет удалена.
Больше примеров кода вы найдете в нашем репозитории GitHub .
Что такое ООП
Аббревиатура ООП расшифровывается как «Объектно-ориентированное программирование». Если Вы читали более ранние статьи из «Самоучителя по 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. В рамках данного подхода выделяют следующие термины: абстракция, инкапсуляция, наследование и полиморфизм. Понимание данных принципов служит ключом к построению целостной картины того, как работают программы, написанные на Java. По большому счету, объектно-ориентированный подход позволяет нам описывать классы, определять методы и переменные таким образом, чтобы затем использовать их вновь, частично либо полностью, без нарушения безопасности.
Принципы ООП в Java
Как упоминалось выше, выделяют четыре основные принципа ООП:
- Абстракция. Абстракция означает использование простых вещей для описания чего-то сложного. Например, мы все знаем как пользоваться телевизором, но в тоже время нам не нужно обладать знаниями о том, как он работает чтобы смотреть его. В Java под абстракцией подразумеваются такие вещи, как объекты, классы и переменные, которые в свою очередь лежат в основе более сложного кода. Использование данного принципа позволяет избежать сложности при разработке ПО.
- Инкапсуляция. Под инкапсуляцией подразумевается сокрытие полей внутри объекта с целью защиты данных от внешнего, бесконтрольного изменения со стороны других объектов. Доступ к данным (полям) предоставляется посредством публичных методов (геттеров/сеттеров). Это защитный барьер позволяет хранить информацию в безопасности внутри объекта.
- Наследование. Это особая функциональность в объектно-ориентированных языках программирования, которая позволяет описывать новые классы на основе уже существующих. При этом поля и методы класса-предка становятся доступны и классам-наследникам. Данная фича делает классы более чистыми и понятным за счет устранения дублирования программного кода.
- Полиморфизм. Данный принцип позволяет программистам использовать одни и те же термины для описания различного поведения, зависящего от контекста. Одной из форм полиморфизма в Java является переопределение метода, когда различные формы поведения определяются объектом из которого данный метод был вызван. Другой формой полиморфизма является перегрузка метода, когда его поведение определяется набором передаваемых в метод аргументов.
Каким образом концепции ООП работают в Java
Концепции ООП в Java позволяют программистам создавать компоненты, которые можно переиспользовать в различных частях программы не подвергая данные опасности.
Принцип работы абстракции
Основная цель использования данной концепции — это уменьшение сложности компонентов программы за счет скрытия от программиста, использующего эти компоненты, ненужных ему подробностей. Это позволяет реализовать более сложную логику поверх предоставленной абстракции, не вдаваясь в подробности ее реализации.
Приготовление кофе с помощью кофемашины является хорошим примером абстракции. Все, что нам надо знать, что бы ей пользоваться: как налить воды, засыпать кофейные зерна, включить и выбрать вид кофе, который хотим получить. А, как машина будет варить кофе — нам знать не нужно.
В данном примере кофемашина представляет собой абстракцию, которая от нас скрывает все подробности варки кофе. Нам лишь остается просто взаимодействовать с простым интерфейсом, который не требует от нас каких-либо знаний о внутренней реализации машины.
Этот же подход можно использовать и в объектно-ориентированных языках программирования, таких как Java.
Принцип работы инкапсуляции
Инкапсуляция позволяет нам пользоваться возможностями класса без создания угрозы безопасности данных за счет ограничения прямого доступа к его полям. Также она позволяет изменять код классов не создавая проблем их пользователям (другим классам). В Java данный принцип достигается за счет использования ключевого слова private .
Принцип работы наследования
Наследование — еще одна важная концепция ООП, которая позволяет сэкономить время на написании кода. Возможности наследования раскрываются в том, что новому классу передаются свойства и методы уже описанного ранее класса. Класс, который наследуется называется дочерним (или подклассом). Класс, от которого наследуется новый класс — называется родительским, предком и т. д. В языке программирования Java используется ключевое слово extends для того, чтобы указать на класс-предок.
Принцип работы полиморфизма
Полиморфизм предоставляет возможность единообразно обрабатывать объекты с различной реализацией при условии наличия у них общего интерфейса или класса. По-простому: способность вызывать нужные методы у объектов, имеющие разные типы (но находящиеся в одной иерархии). При этом происходит автоматический выбор нужного метода в зависимости от типа объекта.
Рассмотрим примеры полиморфизма в Java: переопределение и перегрузка методов.
В случае с переопределением метода, дочерний класс, используя концепцию полиморфизма, может изменить (переопределить) поведение метода родительского класса. Это позволяет программисту по разному использовать один и тот же метод, определяя поведение из контекста вызова (вызывается метод из класса предка или класса наследника).
В случае же с перегрузкой, метод может проявлять различное поведение в зависимости от того, какие аргументы он принимает. В данном случае контекст вызова определяется набором параметров метода.