Объектно ориентированное программирование в Java
Покупка
Основная коллекция
Тематика:
Программирование на Java
Издательство:
Московский педагогический государственный университет
Автор:
Гуськова Ольга Ивановна
Год издания: 2018
Кол-во страниц: 240
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Магистратура
ISBN: 978-5-4263-0648-6
Артикул: 708306.01.99
Учебное пособие посвящено объектно ориентированному программированию на языке Java. Рассматриваются основные принципы объектно ориентированного программирования, средства работы со структурами данных - коллекции и дженерики, принципы объектно ориентированного дизайна.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.02: Прикладная математика и информатика
- 02.03.02: Фундаментальная информатика и информационные технологии
- 03.03.02: Прикладная математика и информатика
- 04.03.02: Химия, физика и механика материалов
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования «Московский педагогический государственный университет» О. И. Гуськова ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA Учебное пособие МПГУ Москва • 2018
УДК 004.424(075.8) ББК 32.973-018я73 Г968 Рецензенты: О. В. Муравьева, кандидат физико-математических наук, доцент, зам. зав. кафедрой теоретической информатики и дискретной математики математического факультета МПГУ В. П. Моисеев, доцент, кандидат технических наук, доцент кафедры информатики и прикладной математики Института математики, информатики и естественных наук МГПУ Гуськова, Ольга Ивановна. Г968 Объектно ориентированное программирование в Java : учебное пособие / О. И. Гуськова. – Москва : МПГУ, 2018. – 240 с. ISBN 978-5-4263-0648-6 Учебное пособие посвящено объектно ориентированному программированию на языке Java. Рассматриваются основные принципы объектно ориентированного программирования, средства работы со структурами данных – коллекции и дженерики, принципы объектно ориентированного дизайна. УДК 004.424(075.8) ББК 32.973-018я73 ISBN 978-5-4263-0648-6 © МПГУ, 2018 © Гуськова О. И., текст, 2018
СОДЕРЖАНИЕ ВВЕДЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6 1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ 1.1. Введение в объектно ориентированное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7 1.2. Краткая история развития объектно ориентированного программирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 1.3. Основные принципы объектно ориентированного программирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11 1.4. Класс и объект . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12 1.5. Определение класса в Java . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 1.6. Создание экземпляров класса . . . . . . . . . . . . . . . . . . . . . . . . .15 1.7. Оператор «Точка» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16 1.8. Переменные-члены и методы-члены класса . . . . . . . . . . . .17 1.9. Пример объектно ориентированного программирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18 1.10. Конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22 1.11. Модификаторы управления доступом и области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23 1.12. Сокрытие информации и инкапсуляция . . . . . . . . . . . . . . .26 1.13. Геттеры и сеттеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 1.14. Ключевое слово “this” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28 1.15. Метод toString() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 1.16. Константы (fi nal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32 1.17. Резюме по изменению класса Circle . . . . . . . . . . . . . . . . . . .32 1.18. Примеры классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35 2. КОМПОЗИЦИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 2.1. Пример классов «Автор» и «Книга» . . . . . . . . . . . . . . . . . . . .48 2.2. Пример классов «Точка» и «Отрезок» . . . . . . . . . . . . . . . . . .55 2.3. Пример классов «Точка» и «Круг» . . . . . . . . . . . . . . . . . . . . . .63 3. НАСЛЕДОВАНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70 3.1. Области видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71 3.2. Переопределение методов и сокрытие полей . . . . . . . . . . .74 3.3. Аннотация @Override . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76 3.4. Ключевое слово “super” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA 3.5. Дополнение о конструкторах . . . . . . . . . . . . . . . . . . . . . . . . . .77 3.6. Конструктор без параметров по умолчанию . . . . . . . . . . . .78 3.7. Одиночное наследование . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78 3.8. Общий корневой класс java.lang.Object . . . . . . . . . . . . . . . . .79 4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ 4.1. Подстановка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80 4.2. Апкастинг и даункастинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81 4.3. Оператор “instanceof” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82 4.4. Резюме по полиморфизму . . . . . . . . . . . . . . . . . . . . . . . . . . . .83 4.5. Пример полиморфизма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84 5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ 5.1. Абстрактный метод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91 5.2. Абстрактный класс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91 5.3. Интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95 5.4. Реализация множественных интерфейсов . . . . . . . . . . . . . .99 5.5. Интерфейс и абстрактный суперкласс . . . . . . . . . . . . . . . . .102 5.6. Динамическое (позднее) связывание. . . . . . . . . . . . . . . . . .102 5.7. Инкапсуляция, связывание и связность . . . . . . . . . . . . . . . .103 6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК «КОЛЛЕКЦИИ» 6.1. Введение во фреймворк «Коллекции» . . . . . . . . . . . . . . . . .112 6.2. Коллекции и небезопасность типов . . . . . . . . . . . . . . . . . . .118 6.3. Введение в дженерики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .119 6.4. Дженерик-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122 6.5. Дженерик-методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131 6.6. Wildcards – подстановочные символы . . . . . . . . . . . . . . . . .134 6.7. Дженерики, ограничивающие тип . . . . . . . . . . . . . . . . . . . .140 7. КОЛЛЕКЦИИ 7.1. ArrayList с дженериками . . . . . . . . . . . . . . . . . . . . . . . . . . . .144 7.2. Обратная совместимость . . . . . . . . . . . . . . . . . . . . . . . . . . . .146 7.3. Автобоксинг и автоанбоксинг – автоупаковка и автораспаковка . . . . . . . . . . . . . . . . . . . . . . . . . .147 7.4. Иерархия интерфейсов во фреймворке «Коллекции» . . . .151 7.5. Интерфейсы Iterable<E>, Iterator<E> и усовершенствованный цикл for . . . . . . . . . . . . . . . . . . . . . . . .152
СОДЕРЖАНИЕ 7.6. Интерфейс Collection<E> и его подинтерфейсы List<E>, Set<E>, Queue<E> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .155 7.7. Интерфейс Map<K,V> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157 7.8. Интерфейс List<E> и его реализации . . . . . . . . . . . . . . . . . .158 7.9. Упорядочение, сортировка и поиск . . . . . . . . . . . . . . . . . . .175 7.10. Set<E> – интерфейсы и реализации . . . . . . . . . . . . . . . . . .180 7.11. Queue<E> – интерфейсы и реализации . . . . . . . . . . . . . . .190 7.12. Интерфейсы и реализации Map<K,V> . . . . . . . . . . . . . . . . .195 7.13. Алгоритмы фреймворка «Коллекции» . . . . . . . . . . . . . . . .199 8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА (ООД) КЛАССОВ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .211 8.1. SRP – Single responsibility Principle – принцип единственной ответственности . . . . . . . . . . . . . . . . . . . . . . . . . .213 8.2. OCP – Open Close Principle – принцип открытости/закрытости . . . . . . . . . . . . . . . . . . . . . . . .216 8.3. LSP – Liskov’s Substitution Principle – принцип замещения Барбары Лисков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220 8.4. ISP – Interface Segregation principle – принцип разделения интерфейса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .224 8.5. DIP – Dependency Inversion principle – принцип инверсии зависимостей . . . . . . . . . . . . . . . . . . . . . . . .228 8.6. Другие принципы ООП и ООД . . . . . . . . . . . . . . . . . . . . . . . .233 ЗАКЛЮЧЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236 БИБЛИОГРАФИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .238
ВВЕДЕНИЕ Учебное пособие предназначено для магистрантов, обучающихся по программе «Профильное и углубленное обучение информатике», дисциплина – «Языки и методы программирования», и может быть также интересно студентам бакалавриата и всем интересующимся объектно ориентированным программированием и его реализацией на языке Java. Целями освоения дисциплины «Языки и методы программирования» является формирование систематизированных знаний в области объектно ориентированного программирования на языке Java, приобретение навыков разработки программного кода с использованием современных кросс-платформенных инструментальных средств. Для изучения данного учебного пособия необходимо знакомство с основными понятиями языка Java, такими, как переменные, типы данных, массивы, методы и т.д. Для изучения глав 6 и 7 желательно, хотя и необязательно, понимание работы со структурами данных и знакомство с обработкой исключений. Учебное пособие состоит из 8 глав. В первой главе рассматриваются основные понятия и принципы объектно ориентированного программирования. Во второй главе рассматриваются отношения между классами, при этом особое внимание уделено композиции. Третья глава посвящена наследованию. В четвертой главе изучаются средства реализации в Java принципа полиморфизма, использование абстрактных классов и интерфейсов рассматривается в пятой главе. Шестая и седьмая главы предназначены для изучения работы с дженериками и коллекциями. В восьмой главе обсуждаются принципы объектно ориентированного проектирования SOLID. Каждая глава содержит примеры, иллюстрирующие изучаемые понятия. Кроме того, главы содержат контрольные вопросы и задания для самостоятельной работы. Учебное пособие основано на материалах для преподавания дисциплин «Языки и методы программирования» и «Практикум по решению задач алгоритмизации и программирования» магистрантам МПГУ.
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ 1.1. Введение в объектно ориентированное программирование Мы живем в мире объектов. Стол, автомобиль, ручка – это объекты. Наряду с физическими существуют также абстрактные объекты, представителями которых, например, являются числа или геометрические фигуры. Языки структурного программирования не подходят для абстракций высокого уровня при решении задач реальной жизни. Например, программы на C, использующие только такие конструкции, как условный оператор, циклы, массивы, функции, являются низкоуровневыми и их трудно применять для абстрагирования с целью построения моделей реального мира или создания игр. Кроме того, программы, написанные на языках структурного программирования, состоят из функций. Для функций имеется лишь незначительная возможность их повторного использования. Трудно копировать функции из одной программы в другую и повторно использовать в другой программе, так как функции, скорее всего, будут ссылаться на другие функции или глобальные переменные. Другими словами, функции недостаточно инкапсулированы, поэтому их трудно использовать как повторно используемый программный модуль. Исследования департамента обороны США 1970-х годов показали, что 80% бюджета уходило на поддержку программного обеспечения и только 20% – на его разработку. При этом программные модули, как правило, невозможно было повторно использовать в других программах. В то же время компоненты аппаратного обеспечения можно использовать в других устройствах. Поэтому было предложено разрабатывать программное обеспечение таким образом, чтобы оно обладало свойствами объекта аппаратного обеспечения.
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA 8 Для преодоления недостатков структурного программирования были разработаны языки, поддерживающие парадигму объектно ориентированного программирования. Объектно ориентированное программирование (ООП) – методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. Объект – это сущность, обладающая определенным поведением и способом представления. Класс – это шаблон, или прототип, по которому создаются объекты. Класс моделирует состояние и поведение объектов реального мира. Например, автомобиль является экземпляром класса автомобилей. Однако если имеется несколько конкретных автомобилей, то они не являются классом, потому что класс – это абстракция. Класс содержит статические свойства (их также называют полями, атрибутами, характеристиками, переменными-членами класса) и динамическое поведение, общие для всех объектов, в закрытом «запечатанном ящике» и определяет открытый интерфейс для использования таких «ящиков». Поскольку классы хорошо инкапсулированы, то их легко использовать повторно. Таким образом, объектно ориентированное программирование в классе объединяет данные и инструкции для обработки данных. Объект в ООП – это экземпляр некоторого класса. Все экземпляры класса имеют одинаковые свойства, описанные в определении класса. Например, можно создать класс «Студент» и определить три экземпляра данного класса: Ivanov, Petrov, Sidorov.
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ 1.2. Краткая история развития объектно ориентированного программирования Первым объектно ориентированным языком программирования считается Симула-67, разработанный в 1967 г., хотя Симула-67 традиционно не считается объектно ориентированным языком в каноническом смысле этого слова. Этот язык в значительной степени опередил свое время, современники (программисты 60-х годов) оказались не готовы воспринять ценности языка Симула-67, и он не выдержал конкуренции с другими языками программирования. В 1970 г. Алан Кэй и его исследовательская группа в компании Xerox PARK создали персональный компьютер, названный Dynabook и первый объектно ориентированный язык программирования Smalltalk для программирования на этом компьютере. По мнению Алана Кея, которого считают одним из «отцов-основателей» ООП, объектно ориентированный подход заключается в следующем наборе основных принципов (цитата): «1. Все является объектом. 2. Вычисления осуществляются путем взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение – это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. 3. Каждый объект имеет независимую память, которая состоит из других объектов. 4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки). 5. В классе задается поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия. 6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA 10 и поведение, связанные с экземплярами определенного класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве. Таким образом, программа представляет собой набор объектов, имеющих состояние и поведение. Объекты взаимодействуют посредством сообщений. Естественным образом выстраивается иерархия объектов: программа в целом – это объект, для выполнения своих функций она обращается к входящим в нее объектам, которые, в свою очередь, выполняют запрошенное путем обращения к другим объектам программы. Естественно, чтобы избежать бесконечной рекурсии в обращениях, на каком-то этапе объект трансформирует обращенное к нему сообщение в сообщения к стандартным системным объектам, предоставляемым языком и средой программирования. Устойчивость и управляемость системы обеспечивается за счет четкого разделения ответственности объектов (за каждое действие отвечает определенный объект), однозначного определения интерфейсов межобъектного взаимодействия и полной изолированности внутренней структуры объекта от внешней среды (инкапсуляции)». В 1980-х годах Гради Буч создал метод разработки программного обеспечения, опубликованный сначала в статье, а затем в книге «Объектно ориентированный анализ и проектирование». Впоследствии он развил свои идеи на методы объектно ориентированного дизайна. В 1990-х Йордан Коад включил идеи поведения в объектно ориентированные методы. Значительный вклад в развитие объектно ориентированного подхода был сделан разработкой техники объектного моделирования (Object-Modelling Techniques (OMT)) Джеймса Румбаха и описанием процесса разработки программного обеспечения OOSE (Object-Oriented Software Engineering) Ивара Якобсона. В 1994 году Гради Буч и Джеймс Рамбо разрабатывали новый язык объектно ориентированного моделирования. За основу языка ими были взяты методы моделирования, разработанные Бучем (метод Буча) и Рамбо (Object-Modeling Technique – OMT).