Программирование на JAVA

Навигация

Лекция 1. Что такое Java? История создания

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

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

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Лекция 3. Лексика языка

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

Лекция 4. Типы данных

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

Лекция 5. Имена. Пакеты

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

Лекция 6. Объявление классов

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

Лекция 7. Преобразование типов

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

Лекция 8. Объектная модель в Java

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

Лекция 9. Массивы

161 162 163 164 165 166 167 168 169 170 171 172 173 174

Лекция 10. Операторы и структура кода. Исключения

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195

Лекция 11. Пакет java.awt

196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224

Лекция 12. Потоки выполнения. Синхронизация

225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241

Лекция 13. Пакет java.lang

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260

Лекция 14. Пакет java.util

261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

Лекция 15. Пакет java.io

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314

Лекция 16. Введение в сетевые протоколы

315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344

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

В сложных иерархиях классов поля и методы обычно наследуются с разных уровней. И не всегда легко определить, какие поля и методы фак­тически относятся к данному классу. Для получения такой информации нужны специальные инструменты, вроде навигаторов классов. Если кон­кретный класс расширяется, то каждый метод обычно сокращают перед передачей сообщения базовому классу. Реализация операции, таким об­разом, рассредоточивается по нескольким классам, и чтобы понять, как она работает, нам приходится внимательно просматривать весь код.

Методы, как правило, короче процедур, поскольку они осуществляют только одну операцию над данными, зато их намного больше. В коротких методах легче разобраться, но они неудобны тем, что код для обработки со­общения иногда "размазан" по многим маленьким методам.

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

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

1. Неэффективность на этапе выполнения. В языках типа Smalltalk со­общения интерпретируются во время выполнения программы путем осуществления их поиска в одной или нескольких таблицах и за счет выбора подходящего метода. Конечно, это медленный процесс. И да­же при использовании наилучших методов оптимизации Smalltalk-программы в десять раз медленнее оптимизированных С-программ. В гибридных языках типа Oberon-2, Object Pascal и С++ отправка сообщения приводит лишь к вызову через указатель процедурной переменной. На некоторых машинах сообщения выполняются лишь на 10% медленнее, чем обычные процедурные вызовы. И по­скольку сообщения встречаются в программе гораздо реже других операций, их воздействие на время выполнения влияния практи­чески не оказывает.

Однако существует другой фактор, который влияет на время выпол­нения: это инкапсуляция данных. Рекомендуется не предоставлять прямой доступ к полям класса, а выполнять каждую операцию над данными через методы. Такая схема приводит к необходимости вы­полнения процедурного вызова каждый раз при доступе к данным. Однако если инкапсуляция используется только там, где она необ­ходима (т.е. в тех случаях, когда это становится преимуществом), то замедление вполне приемлемое.

2. Неэффективность в смысле распределения памяти. Динамическое связывание и проверка типа на этапе выполнения требуют по ходу работы информации о типе объекта. Такая информация хранится в дескрипторе типа и он выделяется один на кл&сс. Каждый объект имеет невидимый указатель на дескриптор типа для своего класса. Таким образом, в объектно-ориентированных программах необхо­димая дополнительная память выражается в одном указателе для объекта и в одном дескрипторе типа для класса.

3. Излишняя универсальность. Неэффективность также может озна­чать, что в программе реализованы избыточные возможности. В библиотечном классе часто содержится больше методов, чем это реально необходимо. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом. Это не влияет на время выполнения, но сказывается на размере кода.

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

Заключение

В этой лекции мы рассказали об объектно-ориентированном подхо­де к разработке ПО, а также о том, что послужило предпосылками к его появлению и сделало его популярным. Были рассмотрены ключевые по­нятия ООП - объект и класс. Далее были описаны основные свойства объектной модели - инкапсуляции, наследование, полиморфизм. Основ­ными видами отношений между классами являются наследование, ассоци­ация, агрегация, метакласс. Также были описаны правила изображения классов и связей между ними на языке ТЛМЬ.

Вариант 1

1.      Почему объектно-ориентированное программирование пришло на смену процедурному программированию?

□       программы, написанные с использованием ООП, выполняются на компьютере быстрее

□       использование ООП позволяет создавать не зависящие от платформы программы

□ ООП позволяет уменьшить сложность создаваемого ПО

□ ООП позволяет увеличить надежность создаваемого ПО

2.       Что используется для описания поведения объекта?

□        поля П   методы

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

3.       Инкапсуляция - это:

□       объединение данных и обрабатывающего их программного кода в одной логической структуре (классе)

□       сокрытие реализации класса и отделение его внутреннего представления от внешнего интерфейса

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


Вариант 2

1.       Что из перечисленного является классами, а что - объектами (отметьте классы):

П      яблоко

П      Иван Сидорович Петров

П      легковой автомобиль

□       страховое свидетельство №113-043-429-18

2.       Зачем нужен полиморфизм?

П   полиморфизм используется для написания общего кода,

который будет одинаково работать с разными типами данных (объектами разных классов), при условии, что классы, от которых созданы эти объекты, имеют общего предка

П   полиморфизм позволяет создавать в одном классе несколько методов с одинаковыми именами, но с разным набором параметров

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

3.       Метакласс - это:

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

П   некоторый шаблон, который описывает свойства и поведение класса, подобно тому, как класс описывает свойства и поведение объекта

П   класс, от которого наследуются все классы в дереве наследования. Любой из классов в программе обязательно является наследником этого класса (пример java.lang.Object)

2.   Что из перечисленного является в классе «Лифт» внешним интерфейсом:

□ кнопки управления П    разводка проводов

□ реакция на нажатие какой-либо кнопки П                количество людей в лифте

П   марка металла, из которого изготовлен трос

3>   Множественным наследованием называют:

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

О   наследование, в котором участвует множество классов (более двух)

О   отношение наследования, при котором класс-наследник расширяет или дополняет функциональность нескольких базовых классов

—==