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




PDF просмотр
НазваниеЛекция  Что такое Java? История создания  1
страница25/25
Дата конвертации15.10.2012
Размер2.85 Mb.
ТипЛекция
1   ...   17   18   19   20   21   22   23   24   25

Типы отношений между классами
Стр. 13 из 24

"0..1" - ноль или один.
Код,  описывающий  рассмотренную  модель  и  явление  агрегации,  может  выглядеть,
например, следующим образом:
 
// определение класса Fish
public class Fish {
   // определения поля home (ссылка на объект Aquarium)
   private Aquarium home;
   
   public Fish() {
   }
}
// определение класса Aquarium
public class Aquarium {
   // определения поля inhabitants (массив ссылок на объекты Fish)
   private Fish inhabitants[];
   public Aquarium() {
   }
}  
1.5.2. Ассоциация
Если объекты одного класса ссылаются на один или более объектов другого класса, но
ни в ту, ни в другую сторону отношение между объектами не носит характера "владения"
или контейнеризации, то такое отношение называют ассоциацией (association). Отношение
ассоциации  изображается  так  же,как  и  отношение  агрегации,  но  линия,  связывающая
классы - простая, без ромбика.
В  качестве  примера  можно  рассмотреть  программиста  и  его  компьютер.  Между  этими
двумя  объектами  нет  агрегации,  но  существует  четкая  взаимосвязь.  Так,  всегда  можно
установить за какими компьютерами работает какой-либо программист, а также какие люди
пользуются  отдельно  взятым  компьютером.  В  рассмотренном  примере  имеет  место
ассоциация многие-ко-многим.
В  данном  случае  между  экземплярами  классов  Programmer  и  Computer  в  обе  стороны
используется  отношение  "0..n",  т.к.  программист  теоретически  может  не  пользоваться
компьютером (если он теоретик или на пенсии). В свою очередь компьютер может никем
не использоваться (если он новый и еще не установлен).
Код, соответствующий рассмотренному примеру, будет, например, следующим:
 
public class Programmer {
   private Computer computers[];
   
   public Programmer() { 
   }
Программирование на Java
Rendered by www.RenderX.com

Стр. 14 из 24
Основы объектно-ориентированного программирования
}
public class Computer {
   private Programmer programmers[];
   
   public Computer() {
   }

1.5.3. Наследование
Наследование (inheritance) - это отношение между классами, при котором класс использует
структуру или поведение другого (одиночное наследование) или других (множественное
наследование)  классов.  Наследование  вводит  иерархию  "общее/частное",  в  которой
подкласс  наследует  от  одного  или  нескольких  более  общих  суперклассов.  Подклассы
обычно дополняют или переопределяют унаследованную структуру и поведение.
В качестве примера можно рассмотреть задачу, в которой необходимо реализовать классы
"Легковой автомобиль" и "Грузовой автомобиль". Очевидно, эти два класса имеют много
общей функциональности. Так, оба они имеют 4 колеса, двигатель, могут перемещаться
и т.д. Всеми этими свойствами обладает любой автомобиль, не зависимо от того грузовой
он  или  легковой,  5-  или  12-местный.  Разумно  вынести  эти  общие  свойства  и
функциональность  в  отдельный  класс,  например  "Автомобиль",  и  наследовать  от  него
классы  "Легковой  автомобиль"  и  "Грузовой  автомобиль"  чтобы  избежать  повторного
написания одного и того же кода в разных классах.
Отношение обобщения обозначается сплошной линией с треугольной стрелкой на одном
из концов. Стрелка указывает на более общий класс (класс-предок или суперкласс), а ее
отсутствие - на более специальный класс (класс-потомок или подкласс)
Использование  наследования  способствует  уменьшению  количества  кода,  написанного
для описания схожих сущностей, а так же способствует написанию более эффективного
и гибкого кода.
В рассмотренном примере применено одиночное наследование. Некоторый класс так же
может наследовать свойства и поведение сразу нескольких классов. Наиболее популярным
примером применения множественного наследования является проектирование системы
учета товаров в зоомагазине.
Все  животные  в  зоомагазине  являются  наследниками  класса  "Животное",  а  также
наследниками класса "Товар". Т.е. все они имеют возраст, нуждаются в пище и воде, и в
то же время имеют цену и могут быть проданы.
Множественное наследование на диаграмме изображается точно так же как и одиночное
наследование  за  исключением  того,  что  линии  наследования  соединяют  класс-потомок
сразу с несколькими суперклассами.
Не все объектно-ориентированные языки программирования содержат в себе языковые
конструкции для описания множественного наследования.
Многие  объектно-ориентированные  языки  программирования  не  поддерживают
множественное наследование и не имеют синтаксических конструкций для его реализации.
Программирование на Java
Rendered by www.RenderX.com

Типы отношений между классами
Стр. 15 из 24
В  языке  Java  множественное  наследование  имеет  ограниченную  поддержку  через
интерфейсы и будет рассмотрено в следующих главах.
1.5.4. Метаклассы
Итак, любой объект имеет структуру, состоящую из полей и методов. Объекты, имеющие
одинаковую структуру и семантику, описываются одним классом, который и является, по
сути, определением структуры объектов, порожденных от него.
В свою очередь каждый класс, или описание, всегда имеет строгий шаблон, задаваемый
языком программирования или выбранной объектной моделью. Он определяет, например,
допустимо ли множественное наследование, какие ограничения на имен½ование классов,
как описываются п¿оля и методы, набор существующих типов данных и многое другое.
Таким  образом,  класс  можно  рассматривать  как  объект,  у  которого  есть  свойства  (имя,
список полей и их типы, список методов, список аргументов для каждого метода и т.д.).
Также класс может обладать поведением, то есть поддерживать методы. А раз для любого
объекта существует шаблон, описывающий свойства и поведение этого объекта, то его
можно определить и для класса. Такой шаблон, задающий различные классы, называется
метакласс.
Чтобы  легче  представить  себе,  что  такое  метакласс,  рассмотрим  пример  некой
бюрократической организации. Будем считать, что все классы в такой системе - некоторые
строгие инструкции, которые описывают, что нужно сделать, чтобы породить новый объект
(например, нанять нового служащего или открыть новый отдел). Как и полагается классам,
они описывают все свойства новых объектов (например, зарплату и профессиональный
уровень для сотрудников, площадь и имущество для отделов) и их поведение (обязанности
служащих и функции подразделений).
В свою очередь написание новой инструкции можно строго регламентировать. Скажем,
необходимо  использовать  специальный  бланк,  придерживаться  правил  оформления  и
заполнить все обязательные поля (например, номер инструкции и фамилии ответственных
работников) Такая "инструкция инструкций" и будет представлять собой метакласс в ООП.
Итак,  объекты  порождаются  от  классов,  а  классы  -  от  метакласса.  Он,  как  правило,  в
системе  есть  только  один.  Но  существуют  языки  программирования,  в  которых  можно
создавать  и  использовать  собственные  метаклассы,  например  язык  Python.  Например,
функциональность  метакласса  может  быть  следующая:  при  создании  класса  он  будет
просматривать список всех методов в классе и если имя метода имеет вид set_XXX или
get_XXX, то автоматически создать поле с именем XXX, если такого не существует.
Поскольку метакласс сам является классом, то нет никакого смысла в заведении "мета-
мета-классов".
В  языке  Java  также  есть  такое  понятие.  Это  класс,  который  так  и  называется  -  Class
(описывает классы) и располагается в основной библиотеке java.lang. Виртуальная машина
использует  его  по  прямому  назначению.  Когда  загружается  очередной  .class-файл,
содержащий описание нового класса, JVM порождает объект класса Class, который будет
хранить его структуру. Таким образом, Java использует концепцию метакласса в самых
практических целях. С помощью Class реализована поддержка статических (static) полей
и методов. Наконец, этот класс содержит ряд методов, полезных для разработчиков. Они
будут рассмотрены в следующих главах.
Программирование на Java
Rendered by www.RenderX.com

Стр. 16 из 24
Основы объектно-ориентированного программирования
1.6. Достоинства ООП
От любой методики разработки программного обеспечения мы ждем, что она поможет нам
в  решении  наших  задач.  Но  одной  из  самых  значительных  проблем  проектирования
является сложность. Чем больше и сложнее программная система, тем важнее становится
разбить  ее  на  небольшие,  четко  очерченные  части.  Чтобы  справиться  со  сложностью,
необходимо абстрагироваться от мелких деталей. Для этой цели классы представляют
собой весьма удобный инструмент.

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

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

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

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

Изменение поведения во время исполнения.
На этапе исполнения один объект может быть заменен другим, что позволяет легко без
изменения  кода  адаптировать  алгоритм,  в  зависимости  от  того,  какой  используется
объект.

Реализация работы с наследниками.
Алгоритмы можно обобщить настолько, что они уже смогут работать более чем с одним
видом объектов.

Создание “каркаса” (framework).
Независимые от приложения части предметной области могут быть реализованы в виде
набора универсальных классов, или каркаса (framework), и в дальнейшем расширены
за счет добавления частей, специфичных для конкретного приложения.
Часто на практике многоразового использования программного обеспечения добиться не
удается из-за того, что существующие компоненты уже не отвечают новым требованиям.
ООП помогает этого достичь без нарушения работы уже имеющихся клиентов, что позволяет
нам извлечь максимум из многоразового использования компонент.
Программирование на Java
Rendered by www.RenderX.com

Недостатки ООП
Стр. 17 из 24

Сокращается  время  на  разработку,  которое  с  выгодой  может  быть  отдано  другим
задачам.

Компоненты многоразового использования обычно содержат гораздо меньше ошибок,
чем вновь разработанные, ведь они уже не раз подвергались проверке.

Когда  некая  компонента  используется  сразу  несколькими  клиентами,  то  улучшения,
вносимые  в  ее  код,  одновременно  оказывают  свое  положительное  влияние  и  на
множество работающих с ней программ.

Если  программа  опирается  на  стандартные  компоненты,  то  ее  структура  и
пользовательский интерфейс становятся более унифицированными, что облегчает ее
понимание и упрощает ее использование.
1.7. Недостатки ООП
Документирование  классов  -  задача  более  трудная,  чем  это  было  в  случае  процедур  и
модулей.  Поскольку  любой  метод  может  быть  переопределен,  в  документации  должно
говориться не только о том, что делает данный метод, но также и о том, в каком контексте
он вызывается. Ведь переопределенные методы обычно вызываются не клиентом, а самим
каркасом. Таким образом, программист должен знать, какие условия выполняются, когда
вызывается  данный  метод.  Для  абстрактных  методов,  которые  пусты,  в  документации
должно  даже  говориться  о  том,  для  каких  целей  предполагается  использовать
переопределяемый метод.
В сложных иерархиях классов поля и методы обычно наследуются с разных уровней. И
не всегда легко определить, какие поля и методы фактически относятся к данному классу.
Для получения такой информации нужны специальные инструменты вроде навигаторов
классов. Если конкретный класс расширяется, то каждый метод обычно сокращают перед
передачей  сообщения  базовому  классу.  Реализация  операции,  таким  образом,
рассредоточивается  по  нескольким  классам,  и  чтобы  понять,  как  она  работает,  нам
приходится внимательно просматривать весь код.
Методы, как правило, короче процедур, поскольку они осуществляют только одну операцию
над данными. Зато количество методов намного выше. Короткие методы обладают тем
преимуществом, что в них легче разбираться, неудобство же их связано с тем, что код для
обработки сообщения иногда "размазан" по многим маленьким методам.
Абстракцией  данных  не  следует  злоупотреблять.  Чем  больше  данных  скрыто  в  недрах
класса,  тем  сложнее  его  расширять.  Отправной  точкой  здесь  должно  быть  не  то,  что
клиентам не разрешается знать о тех или иных данных, а то, что клиентам для работы с
классом этих данных знать не требуется.
Часто  можно  слышать,  что  ООП  является  неэффективным.  Как  же  дело  обстоит  в
действительности? Мы должны четко проводить грань между неэффективностью на этапе
выполнения, неэффективностью в смысле распределения памяти и неэффективностью,
связанной с излишней универсализацией.
1. Неэффективность  на  этапе  выполнения.  В  языках  типа  Smalltalk  сообщения
интерпретируются во время выполнения программы путем осуществления поиска их
в одной или нескольких таблицах и за счет выбора подходящего метода. Конечно, это
медленный  процесс.  И  даже  при  использовании  наилучших  методов  оптимизации
Smalltalk-программы в десять раз медленнее оптимизированных C-программ.
Программирование на Java
Rendered by www.RenderX.com

Стр. 18 из 24
Основы объектно-ориентированного программирования
В гибридных языках типа Oberon-2, Object Pascal и C++ посылка сообщения приводит
лишь  к  вызову  через  указатель  процедурной  переменной.  На  некоторых  машинах
сообщения выполняются лишь на 10% медленнее, чем обычные процедурные вызовы.
И поскольку сообщения встречаются в программе гораздо реже других операций, их
воздействие на время выполнения влияния практически не оказывает.
Однако  существует  другой  фактор,  который  влияет  на  время  выполнения:  это
инкапсуляция данных. Рекомендуется не предоставлять прямой доступ к полям класса,
а выполнять каждую операцию над данными через методы. Такая схема приводит к
необходимости  выполнения  процедурного  вызова  при  каждом  доступе  к  данным.
Однако,  когда  инкапсуляция  используется  только  там,  где  она  необходима  (т.е.  в
случаях, где это становится преимуществом), то замедление вполне приемлемое.
2. Неэффективность  в  смысле  распределения  памяти.  Динамическое  связывание  и
проверка  типа  на  этапе  выполнения  требуют  по  ходу  работы  информации  о  типе
объекта. Такая информация хранится в дескрипторе типа, и он выделяется один на
класс.  Каждый  объект  имеет  невидимый  указатель  на  дескриптор  типа  для  своего
класса.  Таким  образом,  в  объектно-ориентированных  программах  требуемая
дополнительная  память  выражается  в  одном  указателе  для  объекта  и  в  одном
дескрипторе типа для класса.
3. Излишняя универсальность. Неэффективность может также означать, что программа
имеет  ненужные  возможности.  В  библиотечном  классе  часто  содержится  больше
методов,  чем  это  реально  необходимо.  А  поскольку  лишние  методы  не  могут  быть
удалены, то они становятся мертвым грузом. Это не воздействует на время выполнения,
но влияет на возрастание размера кода.
Одно из возможных решений - строить базовый класс с минимальным числом методов,
а  затем  уже  реализовывать  различные  расширения  этого  класса,  которые  позволят
нарастить функциональность.
Другой  подход  -  дать  возможность  компоновщику  удалять  лишние  методы.  Такие
интеллектуальные компоновщики уже доступны для различных языков и операционных
систем.
Но нельзя утверждать, что ООП неэффективно. Если классы используются лишь там, где
это  действительно  необходимо,  то  потеря  эффективности  из-за  повышенного  расхода
памяти и меньшей производительности незначительна. Кроме того, часто более важной
является надежность программного обеспечения и небольшое время его написания, а не
производительность.
1.8. Заключение
В этой главе Вы узнали об объектно-ориентированном подходе к разработке ПО, а также
о том, что послужило предпосылками к его появлению и сделало его популярным. Были
рассмотрены ключевые понятия ООП – объект и класс. Далее были описаны основные
свойства  объектной  модели  –  инкапсуляции,  наследование  полиморфизм.  Основными
видами  отношений  между  классами  являются  наследование,  ассоциация,  агрегация,
метакласс. Также были описаны правила изображения классов и связей между ними на
языке UML.
Программирование на Java
Rendered by www.RenderX.com

Контрольные вопросы
Стр. 19 из 24
1.9. Контрольные вопросы
2-1.
Почему  объектно-ориентированное  программирование  пришло  на  смену
процедурному программированию?
a.) Как 
показала 
практика, 
традиционные 
методы 
процедурного
программирования не способны справиться ни с нарастающей сложностью
программ  и  их  разработки,  ни  с  необходимостью  повышения  их
надежности.  Во  второй  половине  80-х  годов  возникла  настоятельная
потребность в новой методологии программирования, которая была бы
способна  решить  эти  проблемы.  Такой  методологией  стало  объектно-
ориентированное программирование (ООП).
2-2.
Что такое объект? Приведите примеры.
a.) объектом  называют  понятие,  абстракцию  или  любой  предмет  с  четко
очерченными границами, имеющую смысл в контексте рассматриваемой
прикладной проблемы. Введение объектов преследует две цели:

понимание прикладной задачи (проблемы);

введение основы для реализации на компьютере.
Примеры объектов: форточка, Банк "Империал", Петр Сидоров, дело №
7461, сберкнижка и т.д.
2-3.
Что из перечисленного является классами, а что объектами:
1. яблоко;
2. Иван Сидорович Петров;
3. легковой автомобиль;
4. Страховое свидетельство №113-043-429-18.
a.) Яблоко  и  легковой  автомобиль  являются  классами,  а  Иван  Сидорович
Петров и страховое свидетельство №113-043-429-18 - объектами.
Классом  всегда  является  более  общее  понятие,  а  объектом  –  более
конкретное. Например, для страхового свидетельства №113-043-429-18
классом  будет  являться  просто  страховое  свидетельство,  а  примером
объекта для класса «яблоко» может быть «большое красное яблоко».
Программирование на Java
Rendered by www.RenderX.com


Стр. 20 из 24
Основы объектно-ориентированного программирования
2-4.
Найдите ошибку на приведенной диаграмме:
a.) На диаграмме неверно изображены стрелки обозначающие наследование.
Класс  «Человек»  является  более  общим  по  отношению  к  классам
«Студент» и «Лектор» следовательно, он является предком этих классов.
Направление стрелок обозначающих наследование должно быть от предка
к наследнику.
2-5.
Перечислите основные состояния для кофейного автомата.
a.) Примеры состояний кофейного автомата:
1. ожидание монеты;
2. ожидание выбора напитка покупателем;
3. наливает напиток в стакан;
4. ждет, пока покупатель заберет наполненный стакан.
2-6.
Что используется для описания поведения объекта? Варианты ответов:
1. поля;
2. методы;
3. наследование.
a.) Ответ: для описания поведения объектов какого-либо класса используются
методы.
2-7.
Зачем нужен полиморфизм?
a.) Полиморфизм используется для написания общего кода, который будет
одинаково работать с разными типами данных (объектами разных классов),
при условии что классы, от которых созданы эти объекты, имеют общего
предка.
2-8.
Какое отношение существует между человеком и каким-либо внутренним органом
этого человека: ассоциация или агрегация? Объясните почему.
Программирование на Java
Rendered by www.RenderX.com



Контрольные вопросы
Стр. 21 из 24
a.) Ответ:  агрегация.  Человеческий  организм  состоит  из  органов.  Обычно,
если к классам применимо выражение «состоит из» или «содержит», то
используется агрегация, а не ассоциация.
2-9.
Даны  объекты:  моторная  лодка,  вездеход,  амфибия.  Какие  классы  Вы  бы
спроектировали для моделирования этих объектов? Постройте дерево наследования
этих классов.
a.) Ответ:
2-10. Даны объекты:
1. Книга «Java2: руководство разработчика»
2. Страница № 342 из книги «Java2: руководство разработчика»
3. Книга «Война и Мир»
4. Вася (покупатель)
Нарисуйте диаграмму классов для данных объектов.
a.)
2-11. Даны классы «Здание» и «Гараж», наследования между ними нет. Класс «Здание»
обладает такими свойствами, как адрес, количество этажей и т.п. Класс «Гараж»
имеет свойства «вместимость» (максимальное количество автомобилей, которые
могут быть размещены в нем), «размер» (максимально допустимая длина машины).
Необходимо, используя существующие классы, спроектировать 2 новых класса:
1. Многоэтажный гараж (целое здание, предназначенное для парковки автомобилей)
2. Коттедж  с  гаражом  (жилой  дом  с  пристроенным  гаражом,  или  гаражом  в
цокольном этаже)
Программирование на Java
Rendered by www.RenderX.com




Стр. 22 из 24
Основы объектно-ориентированного программирования
Нарисуйте диаграмму классов и обозначьте на ней отношения между классами.
a.) Ответы:
1.
2.
2-12. Спроектируйте класс «Кофейный автомат». Напишите, какие свойства и методы вы
бы включили в этот класс.
a.) Один из вариантов класса для кофейного автомата:
2-13. Даны  классы  «Кофейный  автомат»,  «Монета»,  «Бумажная  купюра».  Как  можно
улучшить модель, чтобы не писать различный код в классе «кофейный автомат»
для  работы  с  монетами  и  с  бумажными  деньгами,  при  условии,  что  монеты  и
бумажные купюры должны обрабатываться одинаковым образом.
a.) Ответ:  создать  новый  класс  «Деньги»,  наследниками  которого  сделать
классы «Монета» и «Бумажная купюра». В классе «Кофейный автомат»
написать  код,  который  будет  использовать  класс  «Деньги».  Благодаря
полиморфизму написанный код сможет также работать с экземплярами
классов «Монета» и «Бумажная купюра».
Программирование на Java
Rendered by www.RenderX.com


Контрольные вопросы
Стр. 23 из 24
2-14. Что  из  перечисленного  является  в  классе  «Лифт»  деталями  реализации,  а  что  –
внешним интерфейсом:

кнопки управления;

разводка проводов;

реакция на нажатие какой-либо кнопки;

количество людей в лифте;

марка металла, из которого изготовлен трос.
a.) Ответ:
Внешний интерфейс:

кнопки управления;

количество людей в лифте;
Детали реализации:

разводка проводов;

реакция на нажатие какой-либо кнопки;

марка металла, из которого изготовлен трос.
Программирование на Java
Rendered by www.RenderX.com

Программирование на Java ()
Программирование на Java
Rendered by www.RenderX.com


Программирование на Java
Лекция 3. Лексика языка
20 января2003
Авторы документа:
Николай Вязовик (Центр Sun технологий МФТИ) 
Александр Хельвас (ЦОС и ВТ МФТИ) 
Евгений Жилин (Центр Sun технологий МФТИ) < gene@itc.mipt.ru>
Copyright © 2003  Центр Sun технологий МФТИ,ЦОС и ВТ МФТИ®, Все права защищены.
Аннотация
Лекция посвящена описанию лексики языка Java.
Лексика описывает, из чего состоит текст программы, каким образом он записывается, и
на  какие  простейшие  слова  (лексемы)  компилятор  разбивает  программу  при  анализе.
Лексемы  (или  tokens  в  английском  варианте)  -  это  основные  "кирпичики",  из  которых
строится любая программа на языке Java.
Эта тема раскрывает многие детали внутреннего устройства языка, и невозможно написать
ни  одной  строчки  кода,  не  затронув  ее.  Именно  поэтому  курс  начинается  с  основ
лексического анализа.
Rendered by www.RenderX.com

ii
Оглавление
Лекция 3. Лексика языка ....................................................................................................1
1.  Лексика языка ................................................................................................................ 1
1.1.  Кодировка ..............................................................................................................2
1.2.  Анализ программы ............................................................................................... 2
1.2.1.  Пробелы ....................................................................................................... 3
1.2.2. Комментарии .................................................................................................4
1.2.3.  Лексемы ........................................................................................................8
1.3.  Виды лексем ......................................................................................................... 9
1.3.1.  Идентификаторы ......................................................................................... 9
1.3.2.  Ключевые слова .......................................................................................... 9
1.3.3.  Литералы ....................................................................................................10
1.3.3.1.  Целочисленные литералы ............................................................... 10
1.3.3.2. Дробные литералы ............................................................................ 11
1.3.3.3.  Логические литералы ....................................................................... 13
1.3.3.4.  Символьные литералы .....................................................................13
1.3.3.5.  Строковые литералы ........................................................................ 14
1.3.3.6.  Null литерал .......................................................................................15
1.3.3.7.  Разделители ......................................................................................15
1.3.3.8.  Операторы .........................................................................................15
1.3.3.9.  Заключение ....................................................................................... 15
1.4.  Дополнение: Работа с операторами ................................................................. 16
1.4.1.  Операторы присваивания и сравнения ................................................... 16
1.4.2.  Арифметические операции .......................................................................17
1.4.3.  Логические операторы .............................................................................. 18
1.4.4.  Битовые операции ..................................................................................... 19
1.5. Заключение........................................................................................................... 22
1.6. Контрольные вопросы.......................................................................................... 22
Программирование на Java
Rendered by www.RenderX.com

Стр. 1 из 26
Лекция 3. Лексика языка
Содержание лекции.
1.  Лексика языка ................................................................................................................1
1.1.  Кодировка ....................................................................................................................2
1.2.  Анализ программы ..................................................................................................... 2
1.2.1.  Пробелы ............................................................................................................. 3
1.2.2. Комментарии .......................................................................................................4
1.2.3.  Лексемы ..............................................................................................................8
1.3.  Виды лексем ............................................................................................................... 9
1.3.1.  Идентификаторы ............................................................................................... 9
1.3.2.  Ключевые слова ................................................................................................ 9
1.3.3.  Литералы ..........................................................................................................10
1.3.3.1.  Целочисленные литералы ..................................................................... 10
1.3.3.2. Дробные литералы .................................................................................. 11
1.3.3.3.  Логические литералы ............................................................................. 13
1.3.3.4.  Символьные литералы ...........................................................................13
1.3.3.5.  Строковые литералы ..............................................................................14
1.3.3.6.  Null литерал ............................................................................................ 15
1.3.3.7.  Разделители ............................................................................................15
1.3.3.8.  Операторы ...............................................................................................15
1.3.3.9.  Заключение ............................................................................................. 15
1.4.  Дополнение: Работа с операторами ....................................................................... 16
1.4.1.  Операторы присваивания и сравнения ......................................................... 16
1.4.2.  Арифметические операции .............................................................................17
1.4.3.  Логические операторы .................................................................................... 18
1.4.4.  Битовые операции ........................................................................................... 19
1.5. Заключение................................................................................................................. 22
1.6. Контрольные вопросы................................................................................................22
1. Лексика языка
Лексика описывает, из чего состоит текст программы, каким образом он записывается, и
на  какие  простейшие  слова  (лексемы)  компилятор  разбивает  программу  при  анализе.
Лексемы  (или  tokens  в  английском  варианте)  -  это  основные  "кирпичики",  из  которых
строится любая программа на языке Java.
Эта тема раскрывает многие детали внутреннего устройства языка, и невозможно написать
ни  одной  строчки  кода,  не  затронув  ее.  Именно  поэтому  курс  начинается  с  основ
лексического анализа.
Программирование на Java
Rendered by www.RenderX.com

Стр. 2 из 26
Лексика языка
1.1. Кодировка
Технология  Java,  как  платформа,  изначально  спроектированная  для  Глобальной  сети
Интернет, должна быть многоязыковой, а значит обычный набор символов ASCII (American
Standard  Code  for  Information  Interchange,  Американский  стандартный  код  обмена
информацией),  включающий  в  себя  лишь  латинский  алфавит,  цифры  и  простейшие
специальные  знаки  (скобки,  знаки  препинания,  арифметические  операции  и  др.)  не
достаточен.  Поэтому  для  записи  текста  программы  применяется  более  универсальная
кодировка Unicode.
Как известно, Unicode представляет символы кодом из 2 байт, описывая, таким образом,
65.535 символов. Это позволяет поддерживать практически все распространенные языки
мира. Первые 128 символов совпадают с набором ASCII. Однако, понятно, что требуется
некоторое  специальное  обозначение,  чтобы  иметь  возможность  задавать  в  программе
любой символ Unicode, ведь никакая клавиатура не позволяет вводить более 65 тысяч
различных  знаков.  Эта  конструкция  представляет  символ  Unicode,  используя  только
символы ASCII. Например, если в программу нужно вставить знак с кодом 6917, необходимо
его представить в шестнадцатеричном формате (1B05) и записать:
 \u1B05 
причем  буква  u  должна  быть  прописной,  а  шестнадцатеричные  цифры  A,  B,  C,  D,  E,  F
можно использовать произвольно, как заглавные, так и строчные. Таким образом можно
закодировать  все  символы  Unicode  от  \u0000  до  \uFFFF.  Буквы  русского  алфавита
начинаются с \u0410 (только буква Ё имеет код \u0401) по \u044F (код буквы ё \u0451). В
последних  версиях  JDK  в  состав  демонстрационных  приложений  и  апплетов  входит
небольшая  программа  SymbolTest,  позволяющая  просматривать  весь  набор  символов
Unicode. Ее аналог несложно написать самостоятельно. Для перекодирования больших
текстов  служит  утилита  native2ascii,  также  входящая  в  JDK.  Она  может  работать  как  в
прямом режиме - переводить из разнообразных кодировок в Unicode, записанный ASCII-
символами,  так  и  в  обратном  (опция  -reverse)  -  из  Unicode  в  стандартную  кодировку
операционной системы.
В версиях языка Java до 1.1 применялся Unicode версии 1.1.5, в последнем выпуске 1.4
используется 3.0. Таким образом, Java следит за развитием стандарта и базируется на
современных версиях. Для любой JDK точную версию Unicode, используемую в ней, можно
узнать из документации к классу Character. Официальный веб-сайт стандарта, где можно
получить дополнительную информацию -  http://www.unicode.org/.
Итак,  используя  простейшую  кодировку  ASCII,  можно  ввести  произвольную
последовательность Unicode символов. Далее будет описано, что Unicode используется
не  для  всех  лексем,  а  только  для  тех,  для  которых  важна  поддержка  многих  языков,  а
именно: комментарии, идентификаторы, символьные и строковые литералы. Для записи
остальных лексем вполне достаточно только ASCII символов.
1.2. Анализ программы
Компилятор, анализируя программу, сразу разделяет ее на

пробелы (white spaces);

комментарии (comments);
Программирование на Java
Rendered by www.RenderX.com

Анализ программы
Стр. 3 из 26

основные лексемы (tokens).
1.2.1. Пробелы
Пробелами в данном случае называют все символы, разбивающие текст программы на
лексемы.  Это  как  сам  символ  пробела  (space,  \u0020,  десятичный  код  32),  так  и  знаки
табуляции  и  перевода  строки.  Они  используются  для  разделения  лексем,  а  также  для
оформления кода, чтобы его было легче читать. Например, следующую часть программы
(вычисление корней квадратного уравнения):
 double a = 1, b = 1, c = 6;
double D = b * b - 4 * a * c;
if (D >= 0) {
double x1 = (-b + Math.sqrt (D)) / (2 * a);
double x2 = (-b - Math.sqrt (D)) / (2 * a);
}
 
можно записать и в таком виде:
 double a=1,b=1,c=6;double D=b*b-4*a*c;if(D>=0){double 
x1=(-b+Math.sqrt(D))/(2*a);double x2=(-b-Math.sqrt(D))/(2*a);} 
В  обоих  случаях  компилятор  сгенерирует  абсолютно  одинаковый  код.  Единственное
соображение,  которым  должен  руководствоваться  разработчик  -  легкость  чтения  и
дальнейшей поддержки такого кода.
Для  разбиения  текста  на  строки  в  ASCII  используются  два  символа  -  "возврат  каретки"
(carriage return, CR, \u000d, десятичный код 13) и символ новой строки (linefeed, LF, \u000a,
десятичный код 10). Чтобы не зависеть от особенностей используемой платформы, в Java
применяется наиболее гибкий подход. Завершением строки считается

ASCII-символ LF, символ новой строки;

ASCII-символ CR, "возврат каретки";

символ CR, за которым сразу же следует символ LF.
Разбиение на строки важно для корректного разбиения на лексемы (как уже говорилось,
завершение строки также служит разделителем между лексемами), для правильной работы
со строковыми комментариями (см. следующую тему "Комментарии"), а также для вывода
отладочной  информации  (при  выводе  ошибок  компиляции  и  времени  исполнения
указывается, на какой строке исходного кода они возникли).
Итак, пробелами в Java считаются:

ASCII-символ SP, space, пробел, \u0020, десятичный код 32;

ASCII-символ HT, horizontal tab, символ горизонтальной табуляции, \u0009, десятичный
код 9;

ASCII-символ  FF,  form  feed,  символ  перевода  страницы  (был  введен  для  работы  с
принтером), \u000c, десятичный код 12;

завершение строки.
Программирование на Java
Rendered by www.RenderX.com

Стр. 4 из 26
Лексика языка
1.2.2. Комментарии
Комментарии  не  влияют  на  результирующий  бинарный  код  и  используются  только  для
ввода пояснений к программе.
В Java комментарии бывают 2 видов:

строчные

блочные
Строчные комментарии начинаются с ASCII-символов // и длятся до конца текущей строки.
Как правило, они используются для пояснения именно этой строки, например:
int y=1970; // год рождения
Блочные  комментарии  располагаются  между  ASCII-символами  /*  и  */,  могут  занимать
произвольное количество строк, например:
 /*
   Этот цикл не может начинаться с нуля
   из-за особенностей алгоритма
*/
for (int i=1; i<10; i++) {
 ...

Часто блочные комментарии оформляют следующим образом (каждая строка начинается
с *):
 /*
 * Описание алгоритма работы
 * следующего цикла while
 */
while (x > 0) {
 ...

Блочный комментарий не обязательно должен располагаться на нескольких строках, он
может даже находится в середине оператора:
 float s = 2*Math.PI/*getRadius()*/; // Закомментировано для отладки 
В этом примере блочный комментарий разбивает арифметические операции. Выражение
Math.PI  предоставляет значение константы PI, определенное в классе Math. Вызов метода
getRadius() теперь закомментирован и не будет произведен, переменная s всегда будет
принимать значение 2 PI. Завершает строку строчный комментарий.
Комментарии  не  могут  находиться  внутри  символьных  и  строковых  литералах,
идентификаторах  (эти  понятия  подробно  рассматриваются  далее  в  этой  лекции).
Следующий пример содержит случаи неправильного применения комментариев:
 // В этом примере текст /*…*/ станет просто частью строки s
String s = "text/*just text*/";
/* 
 * Следующая строка станет причиной ошибки при компиляции,
Программирование на Java
Rendered by www.RenderX.com

Анализ программы
Стр. 5 из 26
 * так как комментарий разбил имя метода getRadius()
 */
circle.get/*comment*/Radius(); 
А такой код допустим:
 // Комментарий может разделять вызовы функций:
cirle./*comment*/getRadius();
// Комментарий может заменять пробелы:
int/*comment*/x=1;
 
В  последней  строке  между  названием  типа  данных  int  и  названием  переменной  x
обязательно должен быть пробел или, как в данном примере, комментарий.
Комментарии не могут быть вложенными. Символы /*, */, // не имеют никакого особенного
значения внутри уже открытых комментариев, как строчных, так и блочных. Таким образом,
в следующем примере
 /* начало комментария /* // /** завершение тут: */ 
описан  ровно  один  блочный  комментарий.  А  в  следующем  примере  (строки  кода
пронумерованы для удобства)
 
1. /*
2.   comment
3.  /*
4.    more comments
5.  */
6.   finish
7. */ 
компилятор  выдаст  ошибку.  Блочный  комментарий  начался  в  строке  1  с  комбинации
символов /*. Вторая открывающая комбинация /* на строке 3 будет проигнорирована, так
как находится уже внутри комментария. Символы */ в строке 5 завершат его, а строка 7
породит ошибку - попытка закрыть комментарий, который не был начат.
Любые комментарии полностью удаляются из программы по время компиляции, поэтому
их можно использовать неограниченно, не опасаясь, что это повлияет на бинарный код.
Основное их предназначение - сделать программу простой для понимания, в том числе и
для других разработчиков, которым придется в ней разбираться по какой-либо причине.
Также  комментарии  зачастую  используются  для  временного  исключения  частей  кода,
например
 int x = 2;
int y = 0;
/*
if (x > 0)
 y = y + x*2;
else
 y = -y - x*4;
*/
Программирование на Java
Rendered by www.RenderX.com

Стр. 6 из 26
Лексика языка
y = y*y;// + 2*x;
 
В этом примере закомментировано выражение if-else и оператор сложения +2*x.
Как  уже  говорилось  выше,  комментарии  можно  писать  символами  Unicode,  то  есть  на
любом языке, удобном разработчику.
Кроме этого, существует особый вид блочного комментария - комментарий разработчика.
Он применяется для автоматического создания документации кода. В стандартную поставку
JDK,  начиная  с  версии  1.0,  входит  специальная  утилита  javadoc.  На  вход  ей  подается
исходный код классов, а на выходе получается удобная документация в HTML формате,
которая  описывает  все  классы,  все  их  поля  и  методы.  При  этом  активно  используются
гиперссылки,  что  существенно  упрощает  изучение  программы  по  ее  такому  описанию
(например, читая описание метода, можно одним нажатием мыши перейти на описание
типов, используемых в качестве аргументов или возвращаемого значения). Однако понятно,
что одного названия метода и перечисления его аргументов не достаточно для понимания
его работы. Необходимы дополнительные пояснения от разработчика.
Комментарий разработчика записывается так же, как и блочный. Единственное различие
в начальной комбинации символов - для документации комментарий необходимо начинать
с /**. Например:
 /**
 * Вычисление модуля целого числа.
 * Этот метод возвращает
 * абсолютное значение аргумента x.
 */
int getAbs(int x) {
 if (x>=0)
  return x;
 else
  return -x;

Первое предложение должно содержать краткое резюме всего комментария. В дальнейшем
оно будет использовано как пояснение этой функции в списке всех методов класса (ниже
будут  описаны  все  конструкции  языка,  для  которых  применяется  комментарий
разработчика).
Поскольку  в  результате  создается  HTML-документация,  то  и  комментарий  необходимо
писать по правилам HTML. Допускается применение тегов, таких как  и 
 . Однако,
теги  заголовков  с  

  по  

  и  
  использовать  нельзя,  так  как  они  активно
применяются javadoc для создания структуры документации.
Символ  *  в  начале  каждой  строки  и  предшествующие  ему  пробелы  и  знаки  табуляции
игнорируются.  Их  можно  вообще  не  использовать,  но  они  удобны,  когда  важно
форматирование, например, в примерах кода.
 /**
 * Первое предложение - краткое описание метода. 
 * 

 * Так оформляется пример кода: 
 * 

Программирование на Java
Rendered by www.RenderX.com

Анализ программы
Стр. 7 из 26
 * 

 * if (condition==true) {
 *    x = getWidht();
 *    y = x.getHeight();
 * }
 * 

 * А так описывается HTML-список: 
 * 

     * 
  • Можно использовать наклонный шрифт курсив
     * 
  • или жирный жирный
     * 

 */
public void calculate (int x, int y) {
 ...

Из этого комментария будет сгенерирован HTML-код, выглядящий примерно так:
 Первое предложение - краткое описание метода. 
Так оформляется пример кода: 
if (condition==true) {
   x = getWidht();
   y = x.getHeight();
}
А так описывается HTML-список: 
· Можно использовать наклонный шрифт курсив, 
· или жирный жирный.  
Наконец,  javadoc  поддерживает  специальные  теги.  Они  начинаются  с  символа  @.
Подробное  описание  этих  тегов  можно  найти  в  документации.  Например,  можно
использовать тег @see, чтобы сослаться на другой класс, поле или метод, или даже на
другой интернет-сайт.
 /**
 * Краткое описание.
 *
 * Развернутый комментарий.
 *
 * @see java.lang.String
 * @see java.lang.Math#PI
 * @see Official Java site
 */ 
Первая  ссылка  указывает  на  класс  String  (java.lang  -  название  библиотеки,  в  которой
находится  этот  класс),  вторая  -  на  поле  PI  класса  Math  (символ  #  разделяет  название
класса и его полей или методов), третья ссылается на официальный сайт Java.
Комментарии разработчика могут быть записаны перед объявлением классов, интерфейсов,
полей, методов и конструкторов. Если записать комментарий /** … */ в другой части кода,
Программирование на Java
Rendered by www.RenderX.com

Стр. 8 из 26
Лексика языка
то ошибки не будет, но он не попадет в документацию, генерируемую javadoc. Кроме этого,
можно  описать  и  пакет  (так  называются  библиотеки,  или  модули,  в  Java).  Для  этого
необходимо  создать  специальный  файл  package.html,  сохранить  в  нем  комментарий,  и
поместить его в директории пакета. HTML-текст, содержащийся между тегами    и
1   ...   17   18   19   20   21   22   23   24   25

Похожие:

Лекция  Что такое Java? История создания  1 iconЦель Разработчик Java(Java ee) Краткая информация
Отличные знания и 6-летний опыт в Java. Сертификат Sun Certified Java Programmer (Март 2010, 98%, Java se 6)
Лекция  Что такое Java? История создания  1 iconОбщие представления о языке Java 6
Виртуальная Java-машина, байт-код, jit-компиляция. Категории программ, написанных на языке Java 9
Лекция  Что такое Java? История создания  1 icon    Люди ни во что не верят столь твердо, как в то, о чем они меньше всего знают. Мишель Монтень   Что такое история
...
Лекция  Что такое Java? История создания  1 icon          Java 2    практическое руководство                          Минск 
Б69          Java 2: практ. рук. / И. Н. Блинов, В. С. Романчик. – Мн.: УниверсалПресс, 2005. 
Лекция  Что такое Java? История создания  1 iconЛекция «История Галиции-история её народов» проф. О. Жерноклеев 19. 30 20. 30 Ужин 20. 30 22. 00 Лекция «История евреев Галиции (1772-1939)»

Лекция  Что такое Java? История создания  1 iconУрок дается по теме «История создания и творческая история романа»
Представленный урок является вторым в системе уроков литературы в 11 классе по изучению романа М. А. Булгакова «Мастер и Маргарита»...
Лекция  Что такое Java? История создания  1 iconИстория создания
Заинтересовать историей создания образа главного героя романа Д. Дефо «Приключения Робинзона Крузо»
Лекция  Что такое Java? История создания  1 iconЛекция №8. Особенности занятий легкой атлетикой с детьми, подростками, юношами лекция №9. Особенности занятий легкой атлетикой с женщинами …63 ЛИТЕРАТУРА лекция №1 «Введение в предмет. История развития легкой атлетики»
Лекция №6. Организация и проведение соревнований по легкой атлетике
Лекция  Что такое Java? История создания  1 iconДоктор берест
Знаете ли вы, что такое береза? Не торопитесь с ответом – эта книга убедит вас, что такое
Лекция  Что такое Java? История создания  1 iconТехнология анализа художественного текста
«что  такое  хорошо,  а  что  такое плохо», закладывается нравственный фундамент личности
Разместите кнопку на своём сайте:
TopReferat


База данных защищена авторским правом ©topreferat.znate.ru 2012
обратиться к администрации
ТопРеферат
Главная страница