Guskova O OOP V Java
Guskova O OOP V Java
О. И. Гуськова
ОБЪЕКТНО ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ В JAVA
Учебное пособие
МПГУ
Москва • 2018
УДК 004.424(075.8)
ББК 32.973-018я73
Г968
Рецензенты:
О. В. Муравьева, кандидат физико-математических наук,
доцент, зам. зав. кафедрой теоретической информатики
и дискретной математики математического факультета МПГУ
В. П. Моисеев, доцент, кандидат технических наук,
доцент кафедры информатики и прикладной математики
Института математики, информатики и естественных наук МГПУ
УДК 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. Константы (final) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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
3
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
4
СОДЕРЖАНИЕ
7
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
8
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
9
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
10
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
11
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
12
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Имя
статические свойства
динамическое поведение
Рис. 1.1. Диаграмма класса
13
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Рис. 1.3. Пример изображения двух экземпляров класса – объектов ivanov и petrov.
Или:
14
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
15
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
16
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
17
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
18
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
19
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
20
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
21
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
1.10. Конструкторы
22
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
23
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
24
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Уровень доступа
public Да Да Да Да
protected Да Да Да Нет
Без модифи-
катора (доступ Да Да Нет Нет
по умолчанию)
25
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
26
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
27
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
28
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
29
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Замечания:
• this.имяПеременной – ссылка на поле имяПеременной этого
объекта; this.имяМетода(…) – вызывает метод имяМетода (…)
данного объекта.
• В конструкторе можно использовать this(…) для вызова друго-
го конструктора этого класса.
• Внутри метода можно использовать предложение “return this”
для возврата этого объекта при вызове.
30
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
• имяОбъекта.toString();
• через println;
• через конкатенацию строк, т.е. оператор ‘+’.
Выполнение println(имяОбъекта) с объектом в качестве ар-
гумента неявно вызывает метод toString() для этого объекта.
Например, если в наш класс Circle включен метод toString():
31
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
32
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
33
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
34
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
35
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
• перегружаемые конструкторы;
• геттеры и сеттеры для private переменных-членов класса;
отсутствует сеттер для accountNumber, так как класс спро-
ектирован таким образом, что это поле не может быть из-
менено;
• public методы credit() и debit(), которые добавляют/вычитают
данное значение amount к/из балансу, соответственно;
• метод toString(), который возвращает «Номер счета:xxx,
Баланс=$xxx.xx» с балансом, округленным до двух знаков по-
сле запятой.
Напишем класс Account и программу, тестирующую все public
методы.
Класс Account – файл Account.java
36
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
37
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
38
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Результаты:
Номер счета:1234, Balance=99.99
Номер счета:8888, Balance=0.00
Номер счета:1234, Balance=88.88
Номер счета: 1234
Баланс: 88.88
Номер счета:1234, Balance=98.88
Номер счета:1234, Balance=93.88
Сумма превышает текущий баланс!
Номер счета:1234, Balance=93.88
39
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
40
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
41
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
42
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
43
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
03:02:01
00:00:00
04:05:06
Час: 4
Минута: 5
Секунда: 6
23:59:58
23:59:59
00:00:02
44
1. ОСНОВЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Задания к главе 1
1. Написать программу описания класса Circle на основе при-
мера из раздела 1.7 и написать программу TestCircle, тести-
рующую все public-методы этого класса.
2. Написать программу описания класса Circle из раздела 1.15
c геттерами, сеттерами и методом toString().
3. Изменить программу для класса Time из примера 2 разде-
ла 1.18 таким образом, чтобы выполнялась проверка вход-
ных данных, т.е. в случае значений минут и секунд, выхо-
дящих за диапазон [0,59], и в случае значения часа, не по-
падающего в диапазон [0,23], вывести на экран сообщение
об ошибке.
4. Индивидуальное задание. Описать один из приведенных
ниже классов с использованием геттеров, сеттеров, метода
toString() и дополнительно 2 методов:
45
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
а) треугольники;
б) прямоугольники;
в) рациональные числа;
г) квадратные матрицы;
д) студент;
е) книга в магазине (автор, название, цена, наличие на складе);
ж) пациент;
з) автомобиль;
и) квадратное уравнение (корень, экстремум, …);
к) клиент банка (id, ФИО, адрес, номер счета, номер карты);
л) полином.
2. КОМПОЗИЦИЯ
47
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
48
2. КОМПОЗИЦИЯ
49
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
50
2. КОМПОЗИЦИЯ
51
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
52
2. КОМПОЗИЦИЯ
53
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
54
2. КОМПОЗИЦИЯ
55
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
56
2. КОМПОЗИЦИЯ
57
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
58
2. КОМПОЗИЦИЯ
59
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
60
2. КОМПОЗИЦИЯ
61
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
62
2. КОМПОЗИЦИЯ
63
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
64
2. КОМПОЗИЦИЯ
65
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
66
2. КОМПОЗИЦИЯ
67
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
68
2. КОМПОЗИЦИЯ
Задания к главе 2
1. Проверить работу класса «Автор» (Author).
2. Проверить работу классов «Автор» (Author) и «Книга» (Book).
3. Проверить работу классов «Точка» (Point) и «Отрезок» (Line).
4. Для класса Line написать метод public double getGradient(),
определяющий угол наклона отрезка относительно оси X.
5. Для класса Line написать методы public double distance(int
x, int y) и public double distance(Point p), определяющие рас-
стояние от прямой, проходящей через точки начала и конца
отрезка, до заданной точки.
6. Для класса Line написать метод public boolen intersects(Line
another), который определяет, пересекаются ли данные от-
резки.
3. НАСЛЕДОВАНИЕ
70
3. НАСЛЕДОВАНИЕ
71
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
72
3. НАСЛЕДОВАНИЕ
73
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
74
3. НАСЛЕДОВАНИЕ
75
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
76
3. НАСЛЕДОВАНИЕ
77
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
78
3. НАСЛЕДОВАНИЕ
Задания к главе 3
1. Написать программу реализации класса Cylinder – ци-
линдр – наследник класса Circle – круг из примера 3.1. Ис-
пользовать 3 файла: Circle.java, Cylinder.java, TestCylinder.
java. Проверить работу конструкторов и переопределенных
методов.
2. Вывести на экран площадь поверхности цилиндра (см. п. 1
«Заданий к главе 3»), вычисляемую с помощью переопреде-
ленного метода getArea(). Для описания цилиндра использо-
вать переопределенный метод toString().
3. Написать программу реализации класса Point3D для трех-
мерной точки – наследника класса Point для двумерной точ-
ки. Программа должна содержать конструкторы, геттеры,
сеттеры, метод toString и два дополнительных метода.
4. ПОЛИМОРФИЗМ,
АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
4.1. Подстановка
80
4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
81
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
82
4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
83
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
3.
Замененное значение сохраняет свою идентичность в пере-
определенных методах и скрытых переменных. Если под-
класс переопределяет методы в суперклассе, то будет вы-
полняться версия подкласса вместо версии суперкласса.
Полиморфизм является мощным средством ООП для раз-
деления интерфейса и реализации. Это средство позволяет про-
граммировать интерфейс при проектировании сложных систем.
84
4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
85
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
86
4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
87
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
88
4. ПОЛИМОРФИЗМ, АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
Задания к главе 4
1. Написать программу, реализующую суперкласс Shape (гео-
метрическая фигура) и его подклассы Rectangle (прямо-
угольник) и Triangle (треугольник), в соответствии с диа-
граммой на рис. 4.1 из раздела 4.5.
2. Написать программу, реализующую суперкласс Shape (фи-
гура) и его подклассы Circle (круг) и Rectangle (прямоуголь-
ник), а также Square (квадрат) – подкласс Rectangle в соот-
ветствии с диаграммой на рис. 4.2. Обсудить возможность
реализации такого проекта.
3. Написать программу, реализующую суперкласс Shape из п. 2
заданий к главе 4 как абстрактный с абстрактным методом
getArea().
89
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Рис. 4.2. Диаграмма для суперкласса Shape и его подклассов Circle (круг)
и Rectangle (прямоугольник), а также Square (квадрат) – подкласса Rectangle
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
91
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
92
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
93
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
94
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
Замечания:
• Абстрактный метод не может быть объявлен как final, по-
скольку final-метод не может быть переопределен. С другой
стороны, абстрактный метод должен быть переопределен
в наследнике до того, как будет использован.
• Абстрактный метод не может иметь модификатор private (это
приведет к ошибке компиляции). Это потому, что private-
метод невидим для подкласса и, таким образом, не может
быть переопределен.
5.3. Интерфейс
95
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
96
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
97
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
98
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
99
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
100
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
101
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
102
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
103
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
104
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
Задания к главе 5
1. Написать программу, реализующую абстрактный супер-
класс Shape с абстрактным методом getArea() и его подклас-
сы Rectangle (прямоугольник) и Triangle (треугольник) в со-
ответствии с диаграммой на рис. 5.1 из раздела 5.2.
2. Написать программу, реализующую суперкласс Shape из п. 2
заданий к главе 4 как абстрактный с абстрактным методом
getArea() – см. рис. 5.4.
Два поля класса color(String) и filled(boolean) – protected
поля, они доступны в подклассах и классах одного пакета.
Они обозначены знаком ‘#’. Написать геттеры и сеттеры для всех
полей и toString(). Написать два абстрактных метода getArea()
и getPerimeter() – на диаграмме выделены курсивом.
В подклассах Circle и Rectangle будут переопределяться
и реализовываться абстрактные методы getArea(), getPerimeter()
и toString().
3. Реализовать интерфейс Movable, содержащий абстракт-
ные методы перемещения вверх, вниз, влево, вправо,
для подкласса перемещаемой точки MovablePoint, со-
держащего реализации указанных методов – см. раз-
дел 5.3.
105
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
106
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
107
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
108
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
109
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
110
5. АБСТРАКТНЫЕ КЛАССЫ И ИНТЕРФЕЙСЫ
112
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
113
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
114
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
115
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
116
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
117
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
118
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
119
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
120
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
121
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
6.4. Дженерик-классы
122
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
123
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
124
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
125
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
Привет! (class java.lang.String)
123 (class java.lang.Integer)
55.66 (class java.lang.Double)
Потеря типа
Из предыдущего примера видно, что компилятор заменял пара-
метр типа E фактическим типом (таким, как String, Integer) во вре-
мя инициализации объектов. В этом случае компилятору потребу-
ется создавать новый класс для каждого фактического типа.
В действительности компилятор заменяет все ссылки на па-
раметр типа E на Object, выполняет проверку типов и добавляет
требуемую операцию даункастинга. Например, GenericBox компи-
лируется следующим образом (этот код компилируется без исполь-
зования дженериков):
126
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
127
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Проанализируем программу
MyGenericArrayList<E> объявляет класс-дженерик с формаль-
ным параметром типа<E>. Во время вызова, например,
128
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
129
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
130
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
6.5. Дженерик-методы
131
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
132
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
133
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
134
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
135
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
6 3 10
--------
ABC
136
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
137
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
3 5 10
Программа не будет работать для списка List из Integer или Double,
так как класс String не является наследником класса Number.
138
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
Результаты:
1234
139
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
140
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
Пример
141
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
6. В чем различие между List<? extends T> и List <? super T> ?
7. Можно ли передать List<String> в метод, который принимает
List<Object>?
8. В чем различие между List<?> и List<Object> в Java?
142
6. ДЖЕНЕРИКИ И ВВЕДЕНИЕ ВО ФРЕЙМВОРК « КОЛЛЕКЦИИ »
Задания к главе 6
1. Напишите дженерик-метод для определения количества
элементов в коллекции, которая имеет определенные
свойства (например, состоит из четных чисел, простых
чисел, палиндромов).
2. Напишите дженерик-метод, чтобы поменять местами два
различных элемента массива.
7. КОЛЛЕКЦИИ
144
7. КОЛЛЕКЦИИ
145
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
146
7. КОЛЛЕКЦИИ
147
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
148
7. КОЛЛЕКЦИИ
149
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
150
7. КОЛЛЕКЦИИ
151
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
152
7. КОЛЛЕКЦИИ
153
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
154
7. КОЛЛЕКЦИИ
155
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
156
7. КОЛЛЕКЦИИ
157
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
158
7. КОЛЛЕКЦИИ
159
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
160
7. КОЛЛЕКЦИИ
Методы:
boolean add(E e) – добавляет указанный элемент в конец
списка;
void add(int index, E element) – вставляет указанный элемент
на указанную позицию в списке;
boolean addAll(Collection<? extends E> c) – добавляет все элемен-
ты указанной коллекции в конец данного списка в порядке, опреде-
ленном итератором Iterator данной коллекции;
boolean addAll(int index, Collection<? extends E> c) – добавляет все
элементы указанной коллекции в список, начиная с указанной по-
зиции;
void clear() – удаляет все элементы из списка;
Object clone() – возвращает копию объекта с теми же значениями
полей, что у данного экземпляра ArrayList;
boolean contains(Object o) – возвращает true, если данный список
содержит указанный элемент;
void ensureCapacity(int minCapacity) увеличивает объем данного
экземпляра ArrayList, если это необходимо, чтобы удостовериться,
что он может содержать, по меньшей мере, число элементов, ука-
занное в аргументе minCapacity;
E get(int index) – возвращает элемент, находящийся на указаной
позиции в списке;
int indexOf(Object o) – возвращает индекс первого вхождения
указанного элемента данного списка или -1, если данный список
не содержит указанный элемент;
boolean isEmpty() – возвращает true, если данный список не со-
держит элементов;
Iterator<E> iterator() – возвращает итератор для правильного
прохода по списку;
int lastIndexOf(Object o) – возвращает индекс последнего вхож-
дения указанного элемента данного списка или -1, если список
не содержит данный элемент;
ListIterator<E> listIterator() – возвращает итератор списка (для
прохода в правильной последовательности);
161
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
162
7. КОЛЛЕКЦИИ
163
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
164
7. КОЛЛЕКЦИИ
165
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
166
7. КОЛЛЕКЦИИ
167
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
168
7. КОЛЛЕКЦИИ
169
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
170
7. КОЛЛЕКЦИИ
Таблица 7.1
Различия между классами ArrayList и Vector
ArrayList Vector
1. ArrayList не синхронизирован. Vector синхронизирован.
171
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Пример – Stack<E>
Результаты:
Пустой стек: []
Пустой стек: true
172
7. КОЛЛЕКЦИИ
173
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
Элементы списка ll: [A, A2, F, B, D, E, C, Z]
Элементы списка ll после удаления элементов: [A, A2, D, E, C, Z]
Список ll после удаления первого и последнего элементов: [A2,
D, E, C]
Список ll после изменения: [A2, D, E изменился, C]
174
7. КОЛЛЕКЦИИ
175
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
176
7. КОЛЛЕКЦИИ
Интерфейс java.util.Comparator<T>
Помимо интерфейса Comparable (или естественного сравне-
ния), можно передавать объект Comparator в методы сортиров-
ки (Collections.sort() или Arrays.sort()), чтобы обеспечить точность
контроля при сравнении.
Интерфейс Comparator будет переопределять Comparable, если
это возможно.
Интерфейс java.util.Comparator объявляет метод:
177
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Пример – Comparator
В этом примере вместо используемого по умолчанию интерфей-
са Comparable мы определяем соответствующий класс Comparator
для строк String и целых Integer.
178
7. КОЛЛЕКЦИИ
179
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
180
7. КОЛЛЕКЦИИ
181
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
182
7. КОЛЛЕКЦИИ
183
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
184
7. КОЛЛЕКЦИИ
185
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
186
7. КОЛЛЕКЦИИ
187
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
188
7. КОЛЛЕКЦИИ
189
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
190
7. КОЛЛЕКЦИИ
191
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
192
7. КОЛЛЕКЦИИ
193
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
194
7. КОЛЛЕКЦИИ
195
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
196
7. КОЛЛЕКЦИИ
197
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
198
7. КОЛЛЕКЦИИ
199
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Пример Arrays.binarySearch()
Следующий пример демонстрирует использование метода java.
util.Arrays.binarySearch():
200
7. КОЛЛЕКЦИИ
Результаты:
Отсортированный массив:
Элемент = 5
Элемент = 12
Элемент = 20
Элемент = 30
Элемент = 55
201
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
202
7. КОЛЛЕКЦИИ
203
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Результаты:
Начальное значение списка: [Один, Два, Три, Один, Два, Три]
Список после сортировки: [Один, Один, Три, Три, Два, Два]
204
7. КОЛЛЕКЦИИ
205
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
206
7. КОЛЛЕКЦИИ
207
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
Задания к главе 7
1. Распечатать односвязный список.
2. Определить количество элементов списка.
3. Найти среднее значение элементов списка.
4. Записать список в обратном порядке.
5. Записать список в обратном порядке без рекурсии.
6. Удалить повторяющиеся элементы из списка.
208
7. КОЛЛЕКЦИИ
209
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
211
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
212
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
213
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
214
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
215
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
216
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
217
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
218
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
219
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
220
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
221
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
222
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
223
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
224
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
225
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
226
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
227
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
228
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
229
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
230
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
231
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
232
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
233
О. И. ГУСЬКОВА. ОБЪЕКТНО ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В JAVA
234
8. ПРИНЦИПЫ ОБЪЕКТНО ОРИЕНТИРОВАННОГО ДИЗАЙНА ( ООД ) КЛАССОВ
236
ЗАКЛЮЧЕНИЕ
238
БИБЛИОГРАФИЯ
ОБЪЕКТНО ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ В JAVA
Учебное пособие
Редактор Дубовец В. В.
Оформление обложки Удовенко В. Г.
Компьютерная верстка Ковтун М. А., Дорожкина О. Н.
E-mail: [email protected]