Объектно ориентированное программирование | Java master
Наконец то мы добрались до темы: основы объектно ориентированного программирования (ООП) в языке Java. Это очень полезная и нужная тема, без знаний которой продолжать программировать мы не сможем. Для тех кто джаву не знает теория будет тоже полезной и применимой на других языках программирования.
При изучении статьи: «Классы, методы и конструкторы в Java» мы уже давали определение ООП и установили, что данная парадигма строится на трех китах:
- Наследование — концепция, согласно которой класс может частично или полностью повторить свойства и методы родителя (класса, от которого он наследуется).
- Инкапсуляция — ограничение доступа до некоего кода и предоставление методов для использования этого кода.
- Полиморфизм — способность метода вести себя по разному при разных наборах параметров.
Еще выделяют такую концепция как абстракция — выделение важных свойств объекта и представление важных аспектов предметной области в виде совокупности заимодействующих друг с другом объектов.
Если Вы дочитали до этих строк и ничего не поняли — это нормально)). Без примеров и объяснений понять такое невозможно. Тем более, если Вы никогда не сталкивались с ООП. Прежде чем мы перейдем к примерам нам следует познакомиться с понятием интерфейса и абстрактного класса. Интерфейс — это конструкция похожая на класс. Только класс — это представление объекта с набором параметров и методов, а интерфейс — только с набором методов. Причем интерфейс задает поведение класса. Вот как выглядит интерфейс и как он используется:
package com.interfaces;
//вместо class пишем interface
public interface InterfaceExample {//в интерфейсе находятся методы
//в интерфейсе можно объявлять константы
- String CONST = «My constant»;//по умолчанию, все поля static, final public
void myMethod();//по умолчанию все методы public, abstract
//начаная с Java 8 в интерфейсах возможна реализация методов
//но пока будем считать, что методы можно только объявлять
}
Для имплементации интерфейса нужно использовать ключевое слово implement. Тогда класс, который имплементирует интерфейс обязан реализовать все его методы.
package com.interfaces;
//класс может имплементировать любое количество интерфейсов
public class InterfaceImplementationClass implements InterfaceExample {
@Override
public void myMethod() {
// TODO Auto-generated method stub
}
//аннотация @Override говорит о том что метод переопределен
@Override
// TODO Auto-generated method stub
return null;
}
}
Если не переопределить методы в классе, компилятор будет выдавать ошибку и запустить программу будет невозможно.
Абстрактный класс немного похожий на интерфейс с учетом того, что класс не имплементируется, а наследуется. В Java нет множественного наследования. Класс может унаследоваться только от одного класса. Отчасти, для множественного наследования и создали интерфейсы.
package com.absclasses;
public abstract class AbstractClass {
public static int myVar = 0;//может содержать поля
public abstract void myMethod();//методы без реализации
public int myMethodWithBody(int variable){//методы с реализацией
return variable;
}
}
package com.absclasses;
public class AbstractClassExtension extends AbstractClass {
@Override
public void myMethod() {//реализовать обязательно только абстрактный метод
// TODO Auto-generated method stub
}
- public static void main(String[] args){
AbstractClassExtension abs = new AbstractClassExtension();
- System.out.println(abs.myVar);//все поля и методы наследуются
- System.out.println(abs.myMethodWithBody(4));
}
}
Вывод программы:
0
4
Наследование
Так как мы уже вплотную подобрались к наследованию, предлагаю его и рассмотреть. Как Вы уже поняли в Java механизм наследование реализован абстрактным классом и интерфейсом. В джава наследоваться можно не только от абстрактного класса. Пропишите ключевое слово extends и наследуйте любой класс в которого конструктор не private.
Давайте посмотрим на популярный пример:
package com.absclasses;
public class Animal {
public int countOfLegs;
- public String someFieldWithValue = «My animal value»;
public void introduction(){
- System.out.println(«Hello I’m » + name + » I have » + countOfLegs + » legs»);
}
- public String getVoice(){
return voice;
}
public void someMethodFromParent(){
java-master.com
Урок J-4. Основные понятия объектно-ориентированного программирования | Java для начинающих
Java относится к языкам объектно-ориентированного типа, поэтому, прежде чем приступать к написанию программ, следует познакомиться с принципами объектно-ориентированного программирования.
Основными концепциями здесь являются понятия объект и класс. Программа на языке Java состоит из классов, а каждый класс, в свою очередь, представляет объект реального света. Например, в качестве объекта возьмем робота, в этом случае, в классе Robot, представляющем этот объект, будут описаны его характеристики и поведение, то есть атрибуты и методы.
Класс Robot может состоять из таких атрибутов как:
- ID
- имя
- тип
- цвет
- вес
- скорость передвижения
- …
можно придумать много других атрибутов.
Также класс Robot будет содержать методы, отвечающие за его поведение. К примеру, на начальном этапе робот умеет:
- Приветствовать по имени
- Выполнять какую-либо работу
Абстракция
Важно помнить, что описывая поведение какого-либо объекта, нужно выбрать подходящий для решения конкретной задачи уровень абстракции. Объекты реального света могут быть достаточно сложны, чтобы описать все их характеристики, более того, решение конкретных задач потребует лишь наличие некоторых из них. Таким образом, мы должны абстрагироваться от некоторых конкретных деталей объекта. Но также важно, чтобы абстракция не была слишком обобщенной и позволила правильно моделировать поведение объекта.
Далее рассмотрим 3 главных принципа, на которых строится объектно-ориентированное программирование:
- Инкапсуляция;
- Наследование;
- Полиморфизм.
Инкапсуляция
Инкапсуляция это механизм, объединяющий атрибуты и методы (которые составляют объект) и охраняющий их от внешнего вмешательства. Инкапсуляция — защитная оболочка, позволяющая обращаться к атрибутам и методам класса только внутри этого класса или при помощи специально спроектированного интерфейса.
Атрибуты или методы класса могут быть открытыми (public) или закрытыми (private). Закрытые атрибуты и методы могут быть доступны только внутри класса, в котором они находятся, они не доступны той части программного кода, которая находится вне этого класса. Открытые атрибуты и методы доступны, в том числе, и коду программы вне класса. Таким образом, открытые методы используются для предоставления контролируемого интерфейса к закрытым элементам класса.
Например, представим, что у нашего робота на голове находятся светодиоды, которые меняют цвет по голосовой команде «Измени цвет». Мы не можем ни как по-другому повлиять на смену цвета диодов, потому что этого не позволят настройки приватности. Мы можем повлиять на смену цвета, только при помощи конкретной голосовой команды, которая в данном случае является интерфейсом к светодиодам.
Наследование
Наследование помогает избежать дублирования кода в случае, если нам нужно создать объект на основе уже существующего. В этом случае говорится, что новый объект (
Например, на основе уже существующего объекта Robot мы можем создать новый объект CoffeRobot, который будет варить кофе. Новый робот будет иметь все атрибуты и методы что и предыдущий, плюс содержать дополнительный метод «Варить кофе».
Полиморфизм
Если мы имеем объекты, которые принадлежат одной и той же ветви иерархии (были унаследованы), то для них можно использовать единый интерфейс, который будет для каждого объекта производить однотипное действие, но результат для каждого объекта будет различным (зависящим от этого конкретного объекта).
Например, если мы при помощи наследования создадим серию роботов разных типов (робот, который варит кофе; робот, который моет пол; робот, который поливает цветы), а потом каждому роботу дадим команду «работай», то каждый робот в ответ на ту же самую команду будет делать различные действия, в соответствии с его типом. То есть, единым интерфейсом здесь является объект Robot с методом «работать», а то, как именно он будет работать, зависит от его реализации.
В данной статье понятия ООП были рассмотрены с ознакомительной целью, в дальнейшем они будут рассмотрены более подробно.
Комментарии и пинги к записи запрещены.
study-java.ru
3. Объектно-ориентированное программирование в Java
3.1 Парадигмы программирования
Вся полувековая история программирования компьютеров, а может быть, и история всей науки — это попытка совладать со сложностью окружающего мира. Задачи, встающие перед программистами, становятся все более громоздкими, информация, которую надо обработать, растет как снежный ком. Еще недавно обычными единицами измерения информации были килобайты и мегабайты, а сейчас уже говорят только о гигабайтах и терабайтах. Как только программисты предлагают более-менее удовлетворительное решение предложенных задач, тут же возникают новые, еще более сложные задачи. Программисты придумывают новые методы, создают новые языки. За полвека появилось несколько сотен языков, предложено множество методов и стилей. Некоторые методы и стили становятся общепринятыми и образуют на некоторое время так называемую парадигму программирования.
Первые, даже самые простые программы, написанные в машинных кодах, составляли сотни строк совершенно непонятного текста. Для упрощения и ускорения программирования придумали языки высокого уровня: FORTRAN, Algol и сотни других, возложив рутинные операции по созданию машинного кода на компилятор. Те же программы, переписанные на языках высокого уровня, стали гораздо понятнее и короче. Но жизнь потребовала решения более сложных задач, и программы снова увеличились в размерах, стали необозримыми.
Возникла идея: оформить программу в виде нескольких, по возможности простых, процедур или функций, каждая из которых решает свой определенную задачу. Написать, откомпилировать и отладить небольшую процедуру можно легко и быстро. Затем остается только собрать все процедуры в нужном порядке в одну программу. Кроме того, один раз написанные процедуры можно затем использовать в других программах как строительные кирпичики.
Встал вопрос о том, как выявить структуру программы, разбить программу на процедуры, какую часть кода выделить в отдельную процедуру, как сделать алгоритм решения задачи простым и наглядным, как удобнее связать процедуры между собой. Опытные программисты предложили свои рекомендации, названные структурным программированием. Структурное программирование оказалось удобным и стало парадигмой. Появились языки программирования, например Pascal, на которых удобно писать структурные программы. Более того, на них очень трудно написать неструктурные программы.
Сложность стоящих перед программистами задач проявилась и тут: программу стали содержать сотни процедур, и опять оказались необозримыми. «Кирпичики» стали слишком маленькими. Потребовался новый стиль программирования,
В это же время обнаружилось, что удачная или неудачная структура исходных данных может сильно облегчить или усложнить их обработку. Одни исходные данные удобнее объединить в массив, для других больше подходит структура дерева или стека. Николаус Вирт даже назвал свою книгу «Алгоритмы + структуры данных = программы».
Для того чтобы обеспечить максимальную независимость модулей друг от друга, надо четко отделить процедуры, которые будут вызываться другими модулями,— открытые (public) процедуры, от вспомогательных, которые обрабатывают данные, заключенные в этот модуль, —
Так возникла идея о скрытии, инкапсуляции (incapsulation) данных и методов их обработки. Подобные идеи периодически возникают в дизайне бытовой техники. То телевизоры испещряются кнопками и топорщатся ручками и движками на радость любознательному телезрителю, господствует «приборный» стиль, то вдруг все куда-то пропадает, а на панели остаются только кнопка включения и ручка громкости. Любознательный телезритель берется за отвертку.
Инкапсуляция, конечно, производится не для того, чтобы спрятать от другого модуля что-то любопытное. Здесь преследуются две основные цели. Первая — обеспечить безопасность использования модуля, вынести в интерфейс, сделать общедоступными только те методы обработки информации, которые не могут испортить или удалить исходные данные. Вторая цель — уменьшить сложность, скрыв от внешнего мира ненужные детали реализации.
Опять возник вопрос, каким образом разбить программу на модули? Тут кстати оказались методы решения старой задачи программирования — моделирования действий искусственных и природных объектов: роботов, станков с программным управлением, беспилотных самолетов, людей, животных, растений, систем обеспечения жизнедеятельности, систем управления технологическими процессами.
В самом деле, каждый объект — робот, автомобиль, человек — обладает определенными характеристиками. Ими могут служить: вес, рост, максимальная скорость, угол поворота, грузоподъемность, фамилия, возраст. Объект может производить какие-то действия: перемещаться в пространстве, поворачиваться, поднимать, копать, расти или уменьшаться, есть, пить, рождаться и умирать, изменяя свои первоначальные характеристики. Удобно смоделировать объект в виде модуля. Его характеристики будут данными, постоянными или переменными, а действия — процедурами.
Оказалось удобным сделать и обратное — разбить программу на модули так, чтобы она превратилась в совокупность взаимодействующих объектов. Так возникло объектно-ориентированное программирование (object-oriented programming), сокращенно ООП (OOP) — современная парадигма программирования.
В виде объектов можно представить совсем неожиданные понятия. Например, окно на экране дисплея — это объект, имеющий ширину width и высоту height , расположение на экране, описываемое обычно координатами (х, у) левого верхнего угла окна, а также шрифт, которым в окно выводится текст, скажем, Times New Roman, цвет фона color , несколько кнопок, линейки прокрутки и другие характеристики. Окно может перемещаться по экрану методом move() , увеличиваться или уменьшаться в размерах методом size() , сворачиваться в ярлык методом iconify() , как-то реагировать на действия мыши и нажатия клавиш. Это полноценный объект! Кнопки, полосы прокрутки и прочие элементы окна — это тоже объекты со своими размерами, шрифтами, перемещениями.
Разумеется, считать, что окно само «умеет» выполнять действия, а мы только даем ему поручения: «Свернись, развернись, передвинься», — это несколько неожиданный взгляд на вещи, но ведь сейчас можно подавать команды не только мышью и клавишами, но и голосом!
Идея объектно-ориентированного программирования оказалась очень плодотворной и стала активно развиваться. Выяснилось, что удобно ставить задачу сразу в виде совокупности действующих объектов — возник объектно-ориентированный анализ, ООА. Решили проектировать сложные системы в виде объектов —появилось объектно-ориентированное проектирование, ООП (OOD, object-oriented design).
Рассмотрим подробнее принципы объектно-ориентированного программирования.
studfile.net
Концепции ООП — Java
Что такое объект?
Java — это так называемый объектно-ориентированный (ОО) язык, при помощи которого вы можете заниматься объектно-ориентированным программированием (ООП). Такой стиль программирования очень отличается от процедурного программирования и может показаться немного странным для большинства программистов, не сталкивавшихся с ООП. Прежде всего, надо понять, что такое объект; именно на этом понятии базируется ООП.
Объект — это самостоятельный фрагмент кода, который знает о себе и может рассказать об этом другим объектам, если они зададут вопрос, который он понимает. Объект имеет члены (переменные) и методы, являющиеся вопросами, на которые он может ответить (даже если они не выглядят вопросами). Набор методов, на которые объект знает как реагировать, является его интерфейсом. Некоторые методы являются общедоступными (public), это означает, что другой объект может вызвать (или активизировать) их. Этот набор методов известен под названием public-интерфейс .
Когда один объект вызывает метод другого объекта, это называется передачей сообщения. Эта фраза соответствует ОО-терминологии, но чаще всего в Java-мире люди говорят «Вызвать этот метод», а не «Передать это сообщение». В следующем разделе мы рассмотрим концептуальный пример, который должен прояснить все это.
Концептуальный пример объекта
Предположим, что мы имеем объект Человек. Каждый объект Человек имеет имя, возраст, национальность и пол. Каждый объект Человек знает, как говорить и ходить. Один объект может спросить у другого о его возрасте, или может cказать, чтобы другой объект начал (или закончил) перемещение. В терминах программирования вы можете создать объект Person и назначить ему некоторые переменные (например, имя и возраст). Если вы создали второй объект Person, он может спросить у первого его возраст или сказать ему начать перемещение. Он может сделать это путем вызова методов первого объекта Person. Когда мы начнем писать код на языке Java, вы увидите, как язык реализует концепцию объекта.
Обычно концепция объекта остается неизменной и в языке Java и в других объектно-ориентированных языках программирования, хотя реализуют они ее по-разному. Эта концепция универсальна. По этой причине объектно-ориентированные программисты, независимо от применяемого ими языка, общаются не так, как процедурные программисты. Процедурные программисты часто говорят о функциях и модулях. Объектно-ориентированные программисты говорят об объектах и часто говорят о них, используя личные местоимения. Вы часто можете услышать, как один ОО-программист говорит другому: «Этот объект Supervisor говорит здесь объекту Employee «Дай мне свой ID», поскольку он должен назначить задания для Employee».
Процедурные программисты могут считать такой способ мышления странным, но он является естественным для ОО-программистов. В их программном мире все является объектом (с некоторыми исключениями в языке Java), а программы представляют собой взаимодействие (или разговор) объектов между собой.
Фундаментальные принципы ООП
Естественно, концепция объекта является критичным понятием для ООП, как идея о том, что объекты общаются между собой при помощи сообщений. Но существуют также три других фундаментальных принципа, которые вы должны понимать.
Вы можете запомнить три фундаментальных принципа ООП при помощи акронима PIE (ПНИ):
- Polymorphism (Полиморфизм)
- Inheritance (Наследование)
- Encapsulation (Инкапсуляция)
Это все необычные названия, но эти концепции не трудно понять. В следующих нескольких разделах мы подробно рассмотрим каждую из них в обратном порядке.
Инкапсуляция
Вспомните, что объект является самодостаточной сущностью, содержащей элементы данных и действия, которые он может выполнить с этими элементами. Это реализация принципа, известного под названием сокрытие информации. Идея заключается в следующем. Объект знает о себе. Если другой объект хочет узнать информацию о другом объекте, он должен спросить о ней. В терминах ООП он должен послать сообщение объекту, например, для запроса информации о его возрасте. В терминах Java он должен вызвать метод объекта, который возвращает возраст.
Инкапсуляция гарантирует индивидуальность каждого объекта, а программы представляют собой общение между объектами. Язык программирования Java позволяет программисту нарушить этот принцип, но это почти всегда является плохой идеей.
Наследование
При вашем рождении, говоря с биологической точки зрения, вы являлись комбинацией ДНК ваших родителей. Вы не были точной копией ни одного из них, но были похожи на обоих. ОО использует для объектов этот же принцип. Представьте опять объект Человек. Вспомните, что каждый этот объект имеет национальность. Не все эти объекты имеют одинаковую национальность, но не являются ли они похожими? Конечно! Это не Лошади, или Шимпанзе, или Киты. Это объект Человек. Все объекты Человек имеют определенные общие признаки, отличающие их от животных других типов. Но они немного отличаются друг от друга. Похож ли Ребенок на Подростка? Нет. Они двигаются и говорят по-разному. Но Ребенок определенно является Человеком.
В терминах ООП Человек и Ребенок являются классами в одной иерархии и (вероятнее всего) Ребенок наследует характеристики и поведение от своего родителя. Мы говорим, что конкретный Ребенок имеет тип Человек, или что этот Ребенок наследуется из объекта Человек. Это не срабатывает в обратную сторону — Человек не обязательно Ребенок. Каждый объект Ребенок является экземпляром класса Ребенок, и когда мы создаем объект Ребенок, мы создаем его экземпляр. Представляйте класс как шаблон для экземпляров этого класса. Обычно то, что может делать объект, зависит от типа объекта или, другими словами, от того, экземпляром какого класса он является. И Ребенок, и Подросток имеют тип Человек, но один может работать, а другой нет.
В терминах Java Человек — это суперкласс классов Ребенок и Подросток, которые являются подклассами класса Человек. Еще одной концепцией, связанной с наследованием, является абстракция. Человек находится на более высоком уровне абстракции, чем Ребенок или Подросток. Оба они имеют тип Человек, но несколько отличаются. Все объекты Человек имеют некоторые общие свойства (например, имя и возраст). Вы можете создать экземпляр класса Человек? Нет. Вы имеете либо экземпляр класса Ребенок, либо класса Подросток. Человек, в терминах Java, является абстрактным классом. Вы не можете иметь прямой экземпляр класса Человек. Только Ребенок или Подросток, которые оба имеют тип Человек, являются реальными. Рассмотрение абстрактных классов выходит за рамки данного руководства, поэтому мы больше о них говорить не будем.
Теперь, подумайте, что значит для объекта Ребенок действие «говорить». Мы рассмотрим смысл этого в следующем разделе.
Полиморфизм
«Говорит» ли Ребенок также как Подросток? Конечно же, нет. Ребенок издает шум, который не всегда является распознаваемыми словами, которые используют объекты Подросток. Поэтому, когда я создаю экземпляр объекта Ребенок (высказывание «создать экземпляр Ребенка» означает то же самое — слово «объект» подразумевается) и указываю ему «говорить», он может ворковать или булькать. Ожидается, что Подросток будет более внятен.
В иерархии человечества мы имеем класс Человек на вершине иерархии и классы Ребенок и Подросток ниже, в качестве подклассов. Все объекты Человек могут говорить, поэтому объекты Ребенок и Подросток тоже могут, но делают это по-разному. Ребенок булькает и издает простейшие звуки. Подросток произносит слова. Вот что означает полиморфизм: объекты делают вещи по-разному.
В чем состоит (и в чем нет) объектно-ориентированность языка Java
Как мы увидим, язык Java позволяет создавать первоклассные объекты, но не все в языке является объектом. Это немного не так, как в некоторых других объектных языках, например Smalltalk. Smalltalk является чистым объектно-ориентированным языком, т.е. все в нем является объектом. Язык Java является смесью объектов и других сущностей, не являющихся объектами. Он также позволяет одному объекту знать внутренности другого, если вы, как программист, реализуете такую возможность. Это нарушает принцип инкапсуляции.
Однако язык программирования Java также предоставляет каждому программисту инструменты, необходимые для следования всем правилам ООП и создания очень хорошего объектно-ориентированного кода. Но это требует некоторой дисциплины. Язык не заставляет вас делать правильные вещи.
Хотя многие ярые сторонники объектно-ориентированного подхода справедливо спорят о том, является ли язык Java объектно-ориентированным или нет, это на самом деле не так уж и важно. Платформа Java появилась, чтобы остаться. Научитесь применять ООП с Java там, где это возможно, и оставьте аргументы о чистоте другим. Язык Java позволит вам писать понятные, относительно лаконичные и управляемые программы, которые достаточно хороши для большинства профессиональных ситуаций.
Похожие записи:
kvodo.ru
Основы ООП (Основные концепции ООП)
В этом уроке мы затронем основной принцип в языке Java. Мы изучим основные понятия в ООП и поймет что он из себя представляет.
На начальном этапе ООП – это тёмный лес, в котором многое непонятно и слишком усложнено. На самом деле всё вовсе не так. Предлагаем абстрагироваться от специфических (непонятных) определений и познакомиться с ООП простыми словами.
Поскольку на примере все усвоить гораздо проще, то давайте за пример возьмем робота, которого постараемся описать за счёт классов в ООП.
Класс в случае с роботом – это его чертёж. Экземпляром класса (объектом) называет целый робот, который создан точно по чертежу.
Наследование – это добавление полезных опций к чертежу робота. К примеру, берем стандартный чертёж робота и дорисуем к нему лазеры, крылья и броню. Все эти дорисовки мы сделаем в классе наследнике, основной функционал которого взят из родительского класса.
Полиморфизм – это общий функционал для всех роботов и не важно что каждый робот может очень сильно отличаться друг от друга. К примеру, в главном классе мы указываем возможность передвижения для всех последующих роботов. Далее в классе наследнике мы можем дополнительно указать возможность левитации для робота, в другом же классе укажем возможность передвижения по воде и так далее. Получается, что есть общий функционал что записан в главном чертеже, но его можно переписать для каждого последующего робота (для каждого наследника).
А инкапсуляция является для нас бронёй, защищающей робота. Под пластырем брони находятся уязвимые элементы, вроде проводов и микросхем. После прикрытия брешей с помощью брони (protected
или private
), робот полностью защищён от внешних вмешательств. По сути, мы делаем доступ ко всем полям лишь за счёт методов, тем самым прямой доступ к полю будет закрыт.
У всех классов методы могут отличаться, как и поля с конструкторами. Каждый класс позволяет создавать любое количество разных объектов, все из них имеют собственные характеристики.
itproger.com