Главная страница

Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


Скачать 25.04 Mb.
НазваниеС. Н. Тригуб Перевод с английского и редакция
АнкорJava. Полное руководство. 8-е издание.pdf
Дата28.02.2017
Размер25.04 Mb.
Формат файлаpdf
Имя файлаJava. Полное руководство. 8-е издание.pdf
ТипДокументы
#3236
страница4 из 90
1   2   3   4   5   6   7   8   9   ...   90
ГЛАВА
1%
Обзор языка Как и во всех компьютерных языках, элементы Java существуют не сами по себе. Скорее, они работают совместно, образуя язык в целом. Однако эта взаи­
мосвязанность может затруднять описание какого-то одного аспекта Java без рассмотрения при этом нескольких других. Зачастую для понимания одного свойства необходимы знания о другом. Поэтому в настоящей главе представлен краткий обзор нескольких основных свойств языка Java. Приведенный здесь материал послужит отправной точкой, которая позволит создавать и понимать простые программы. Большинство рассмотренных в этой главе тем будет подробнее рассмотрено в остальных главах этой части.
Объектно-ориентированное программирование
Основной характеристикой языка Java является объектно-ориентированное программирование (ООП). Фактически все программы Java являются в какой-то мере объектно-ориентированными. Язык Java связан с ООП настолько тесно, что прежде чем приступать к написанию на нем даже простейших программ, следует вначале ознакомиться с базовыми принципами ООП. Поэтому начнем с рассмотрения теоретических аспектов ООП.
Все компьютерные программы состоят из двух элементов кода и данных. Более того, концептуально программа может быть организована вокруг своего кода или своих данных. Другими словами, организация одних программ определяется тем что происходит, а других — темна что оказывается влияние. Существует две концепции создания программы. Первую называют моделью, ориентированной на про­

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

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

5 2 Часть I. Язык Java
Абстракция
Важный элемент объектно-ориентированного программирования — абстракция Человеку свойственно представлять сложные явления и объекты при помощи абстракции. Например, люди представляют себе автомобиль не в виде набора десятков тысяч отдельных деталей, а в виде совершенно определенного объекта, имеющего собственное уникальное поведение. Эта абстракция позволяет не задумываться о сложности деталей, образующих автомобиль, скажем, при поездке в магазин. Мы можем не обращать внимания на подробности работы двигателя, коробки передачи тормозной системы. Вместо этого объект можно использовать как единое целое.
Мощное средство применения абстракции — иерархические классификации. Это позволяет упрощать семантику сложных систем, разбивая их на более пригодные для управления фрагменты. Внешне автомобиль выглядит единым объектом. Но стоит заглянуть внутрь, как становится ясно, что он состоит из нескольких подсистем рулевого управления, тормозов, аудиосистемы, привязных ремней, обогревателя, навигатора и т.п. Каждая из этих подсистем, в свою очередь, собрана из более специализированных узлов. Например, аудиосистема состоит из радиоприемника, проигрывателя компакт-дисков и или устройства воспроизведения аудиокассет. Суть сказанного в том, что сложную структуру автомобиля (или любой другой сложной системы) можно описать с помощью иерархических абстракций.
И ерархические абстракции сложных систем можно применять и к компьютерным программам. За счет абстракции данные традиционной, ориентированной на процессы, программы можно преобразовать в составляющие ее объекты. При этом последовательность этапов процесса может быть преобразована в коллекцию сообщений, передаваемых между этими объектами. Таким образом, каждый из этих объектов описывает свое уникальное поведение. Эти объекты можно считать конкретными элементами, которые отвечают на сообщения, указывающие им о необходимости выполнить что-либо. Сказанное — суть объектно-ориентированного программирования.
Концепции объектной ориентированности лежат как в основе языка Java, таки восприятия мира человеком. Важно понимать, как эти концепции реализуются в программах. Как вы увидите, объектно-ориентированное программирование — мощная и естественная концепция создания программ, которые способны пережить неизбежные изменения, сопровождающие жизненный цикл любого крупного программного проекта, включая создание концепции, рост и старение. Например, при наличии тщательно определенных объектов и четких, надежных интерфейсов к этим объектам можно безбоязненно и без особых проблем извлекать или заменять части старой системы.
Три принципа ООП
Все языки объектно-ориентированного программирования предоставляют механизмы, которые облегчают реализацию объектно-ориентированной модели. Этими механизмами являются инкапсуляция, наследование и полиморфизм. Рассмотрим эти концепции.
И нкапсуляция
Механизм, связывающий код и данные, которыми он манипулирует, защищая оба эти компонента от внешнего вмешательства и злоупотреблений, является ин­
Глава 2. Обзор языка Java
5 3
капсуляцией.
Инкапсуляцию можно считать защитной оболочкой, которая предохраняет код и данные от произвольного доступа со стороны другого кода, находящегося снаружи оболочки. Доступ к коду и данным, находящимся внутри оболочки, строго контролируется тщательно определенным интерфейсом. Чтобы провести аналогию с реальным миром, рассмотрим автоматическую коробку передач автомобиля. Она инкапсулирует сотни бит информации об автомобиле, такой как степень ускорения, крутизна поверхности, по которой совершается движение, и положение рычага переключения скоростей. Пользователь (водитель) может влиять на эту сложную инкапсуляцию только одним методом перемещая рычаг переключения скоростей. На коробку передач нельзя влиять, например, при помощи индикатора поворота или дворников. Таким образом, рычаг переключения скоростей — строго определенный (а в действительности единственный) интерфейс к коробке передач. Более того, происходящее внутри коробки передач не влияет на объекты, находящиеся вне ее. Например, переключение передач не включает фары Поскольку функция автоматического переключения передач инкапсу­
лирована, десятки изготовителей автомобилей могут реализовать ее как угодно. Однако сточки зрения водителя все эти коробки передач работают одинаково. Аналогичную идею можно применять к программированию. Сила инкапсулиро­
ванного кода в том, что все знают, как к нему можно получить доступа следовательно, могут его использовать независимо от нюансов реализации и не опасаясь неожиданных побочных эффектов.
В языке Java основой инкапсуляции является класс. Хотя подробнее мы рассмотрим классы в последующих главах книги, сейчас полезно ознакомиться со следующим кратким описанием. Класс
определяет структуру и поведение (данные и код, которые будут совместно использоваться набором объектов. Каждый объект данного класса содержит структуру и поведение, которые определены классом, как если бы объект был отлит в форме класса. Поэтому иногда объекты называют экземплярами класса.
Таким образом, класс — этологическая конструкция, а объект имеет физическое воплощение.
При создании класса определяют код и данные, которые образуют этот класс. Совокупность этих элементов называют членами
класса. В частности, определенные классом данные называют переменными-членами
или переменными экземпляра Код, который выполняет действия по отношению к данным, называют методами
членами
или просто методами.
(То, что программисты на Java называют методом, программисты на C/C++ называют функциями.)
В правильно написанных программах Java методы определяют способы использования переменных-членов. Это означает, что поведение и интерфейс класса определяются методами, которые выполняют действия по отношению к данным его экземпляра.
Поскольку назначение класса — инкапсуляция сложной структуры программы, существуют механизмы сокрытия сложной структуры реализации внутри класса. Каждый метод или переменная в классе могут быть помечены как закрытые или открытые. Открытый
и нтерф ей с класса представляет все, что должны или могут знать внешние пользователи класса. Закрытые
методы и данные могут быть доступны только для кода, который является членом данного класса. Следовательно, любой другой код, не являющийся членом класса, не может получать доступ к закрытому методу или переменной. Поскольку закрытые члены класса доступны другим частям программы только через открытые методы класса, можно быть уверенным в невозможности выполнения неправомерных действий. Конечно, это означает, что открытый интерфейс должен быть тщательно спроектирован и не должен раскрывать лишних нюансов внутренней работы класса (рис 2.1).

5 4 Часть I. Язык Java
Класс
О
Открытые переменные экземпляра не рекомендуются)

А
Открытые методы \ Ах А А А ■
A А A АДА
А
Закрытые методы
Л / А \ АО Ь
Q О
Закрытые переменные экземпляра
Рис. 2.1. Инкапсуляция открытые методы можно использовать для защиты закрытых данных Наследование bПроцесс, в результате которого один объект получает свойства другого, именуется наследованием. Это важно, поскольку наследование обеспечивает концепцию иерархической классификации. Как уже отмечалось, большинство сведений становится доступным для понимания благодаря иерархической (те. нисходящей) классификации. Например, золотистый ретривер — часть классификации собака, которая, в свою очередь, относится к классу млекопитающие, а тот — к еще большему классу животных. Без использования иерархий каждый объект должен был бы явно определять все свои характеристики. Однако благодаря наследованию объект должен определять только те из них, которые делают его уникальным внутри класса. Объект может наследовать общие атрибуты от своего родительского объекта. Таким образом, механизм наследования обеспечивает возможность того, чтобы один объект был особым случаем более общего случая. Рассмотрим этот процесс подробнее.
Как правило, большинство людей воспринимают окружающий мир в виде иерархически связанных между собой объектов, подобных животным, млекопитающими собакам.
Если требуется привести абстрактное описание животных, можно сказать, что они обладают определенными атрибутами, такими как размеры, уровень интеллекта и тип скелета. Животным присущи также определенные особенности поведения они едят, дышат и спят. Приведенное описание атрибутов и поведения — определение класса животных.
Если бы требовалось описать более конкретный класс животных, например млекопитающих, нужно бЦло бы указать более конкретные атрибуты, такие
Глава 2. Обзор языка Java
5 как тип зубов и молочных желез. Это определение называют подклассом
ж ивот­
ных, которые относятся к суперклассу
(родительскому классу) млекопитающ их.
Поскольку млекопитающие — всего лишь более точно определенные животные, они наследуют
все атрибуты животных. Подкласс нижнего уровня иерархии классов наследует
все атрибуты каждого из его родительских классов (рис. 2.2).
^ Животные Млекопитающие
Пресмыкающиеся
Собачьи
j
| Кошачьи i s s * Рис. 2.2. Иерархия классов животных
Наследование связано также с инкапсуляцией. Если данный класс инкапсули­
рует определенные атрибуты, то любой его подкласс будет иметь эти же атрибуты
плюс
любые дополнительные атрибуты, являющиеся составной частью его специализации (рис. 2.3). Эта ключевая концепция позволяет сложности объектно- ориентированных программ возрастать в арифметической, а не геометрической прогрессии. Новый подкласс наследует атрибуты всех своих родительских классов. Поэтому он не содержит непредсказуемых взаимодействий с большей частью остального кода системы.
Полиморф изм
Полиморфизм
(от греч. много форм свойство, которое позволяет использовать один и тот же интерфейс для общего класса действий. Конкретное действие определяется конкретным характером ситуации. Рассмотрим стек (представляющий собой список типа последним вошел, первым вышел. Предположим, программе требуются стеки трех типов для целочисленных значений, для значений с плавающей точкой и для символов. Алгоритм реализации каждого из этих стеков остается неизменным, несмотря на различие хранящихся в них данных. Вне объектно-ориентированном языке пришлось бы создавать три различных набора подпрограмм стека, каждый из которых должен был бы иметь отдельное имя. Однако в Java, благодаря полиморфизму, можно определить общий набор подпрограмм стека, использующих одни и те же имена

5 6 Часть I. Язык Java
Животные
Лабрадор
Лабрадор
Возраст Период беременности
Гончая'?
Пол Охотничьи навыки Выученная для утиной охоты?
Вес Длина хвоста Наличие родословной?
Количество детенышей
Дворовые/комнатные
Рис. 2.3. Лабрадор полностью наследует инкапсулированны е свойства всех родительских классов
В более общем виде концепцию полиморфизма часто выражают фразой один интерфейс, несколько методов. Это означает, что можно спроектировать общий интерфейс для группы связанных между собой действий. Такой подход позволяет уменьшить сложность программы, поскольку один и тот же интерфейс использу­
Глава 2. Обзор языка Java
5 7
ется для указания общего класса действий Выбор же конкретного действия (те. метода, применимого к каждой ситуации, — задача компилятора. Программисту ненужно осуществлять этот выбор вручную. Необходимо лишь помнить об общем интерфейсе и применять его.
Если продолжить аналогию с собаками, можно сказать, что собачье обоняние — полиморфное свойство. Если собака ощутит запах кошки, она залает и погонится за ней. Если собака ощутит запах своего корма, у нее начнется слюноотделение, иона поспешит к своей миске. В обеих ситуациях действует одно и тоже чувство обоняния. Различие в том, что издает запах, те. в типе данных, воздействующих нанос собаки Эту же общую концепцию можно реализовать в Java применительно к методам внутри программы.
Совместное использование полиморфизма инкапсуляции и наследования
При правильном совместном использовании полиморфизм, инкапсуляция и наследование создают среду программирования, которая поддерживает разработку более устойчивых и масштабируемых программ, чем в случае применения модели, ориентированной на процессы. Тщательно спроектированная иерархия классов — основа многократного использования кода, на разработку и проверку которого были затрачены время и усилия. Инкапсуляция позволяет возвращаться к ранее созданным реализациям, не разрушая код, зависящий от открытого интерфейса применяемых в приложении классов. Полиморфизм позволяет создавать понятный, чувствительный, удобочитаемый и устойчивый код.
Из приведенных ранее примеров реального мира пример с автомобилем более полно иллюстрирует возможности объектно-ориентированного проектирования. Пример с собаками хорошо подходит для рассмотрения его сточки зрения наследования, но автомобили имеют больше общего с программами. Садясь за руль различных типов (подклассов) автомобилей, все водители используют наследование. Независимо оттого, является ли автомобиль школьным автобусом, легковым Мерседесом, Порше или семейным микроавтобусом, все водители смогут легко найти руль, тормоза, педаль акселератора и пользоваться ими. Немного повозившись с рычагом переключения передач, большинство людей могут даже оценить различия между ручной и автоматической коробками передач это становится возможным благодаря получению четкого представления об общем родительском классе этих объектов — системе передач.
В процессе использования автомобилей люди постоянно взаимодействуют сих инкапсулированными характеристиками. Педали тормоза и газа скрывают невероятную сложность соответствующих объектов за настолько простым интерфейсом, что управлять этими объектами можно простым нажатием ступней педали Конкретная реализация двигателя, тип тормозов и размер шин не оказывают никакого влияния на способ взаимодействия с определением класса педалей.
Последний атрибут, полиморфизм, четко отражает способность компаний- изготовителей автомобилей предлагать широкое множество вариантов, по сути, одного итого же средства передвижения. Например, на автомобиле могут быть установлены система тормозов с защитой от блокировки или традиционные тормоза, рулевая система с гидроусилителем или с реечной передачей и 4-, 6- или цилиндровые двигатели. В любом случае нужно будет жать на педаль тормоза, чтобы остановиться, вращать руль, чтобы повернуть, и жать на педаль акселератора, чтобы автомобиль двигался. Один и тот же интерфейс может применяться для управления множеством различных реализаций

5 8 Часть I. Язык Как видите, именно совместное применение инкапсуляции, наследования и полиморфизма позволяет преобразовать отдельные детали в объект, который мы называем автомобилем. Сказанное применимо также к компьютерным программам. За счет применения объектно-ориентированных принципов различные части сложной программы могут быть собраны воедино, образуя надежную, пригодную для обслуживания программу.
Как было отмечено вначале этого раздела, каждая программа Java является объектно-ориентированной. Или, точнее, каждая программа Java использует инкапсуляцию, наследование и полиморфизм. Хотя на первый взгляд может показаться, что не все эти свойства используются в приведенных в остальной части этой главы и нескольких последующих главах коротких примерах, тем не менее они в них присутствуют. Как вы вскоре убедитесь, многие функции, предоставляемые языком Java, являются составной частью его встроенных библиотек классов, в которых интенсивно применяются инкапсуляция, наследование и полиморфизм.
Первый пример простой программы
Теперь, когда мы ознакомились с исходными положениями объектно- ориентированного фундамента Java, рассмотрим несколько реальных программ, написанных на этом языке. Начнем с компиляции и запуска представленного в этом разделе короткого примера программы. Вы убедитесь, что эта задача более трудоемкая, чем может показаться.
/*
Это простая программа Назовите этот файл "Example.java".
*/
class Example {
// Программа начинается с обращения к m a i n ( ) .
public static void main(String a r g s []) Простая программа На заметку Последующее описание соответствует стандарту комплекта разработчика Java
SE 7 Developer’s Kit (JDK 7), поставляемому компанией Oracle. При использовании другой среды разработки Java, компиляция и выполнение программ могут потребовать выполнения другой процедуры. Для получения необходимых сведений обратитесь к документации используемого компилятора.
Ввод кода программы
Для большинства языков программирования имя файла, который содержит исходный код программы, не имеет значения. Однако в Java это не так. Прежде всего, следует твердо усвоить, что присваиваемое исходному файлу имя очень важно. В данном случае именем исходного файла должно быть
Example.
j ava. И вот почему.
В Java исходный файл официально называется модулем компиляции Он представляет собой текстовый файл (между прочим, который содержит определения одного или нескольких классов. (Мы пока будем использовать файлы исходного
Глава 2. Обзор языка Java
5 кода, содержащие только один класс) Компилятор Java требует, чтобы исходный файл имел расширение . j Как видно из кода программы, именем определенного программой класса является также
Example. И это неслучайно. В Java весь код должен размещаться внутри класса. В соответствии с принятым соглашением имя этого главного класса должно совпадать с именем файла, содержащего программу. Необходимо также, чтобы написание имени файла соответствовало имени класса, включая строчные и прописные буквы.
Это обусловлено тем, что код Java чувствителен к регистру символов. Пока что соглашение о соответствии имен файлов и имен классов может казаться произвольным. Однако оно упрощает поддержку и организацию программ.
Компиляция программы
Чтобы скомпилировать программу
Example, запустите компилятор
(javac), указав имя исходного файла в командной строке.
С :\>javac Example.j Компилятор javac создаст файл
Example.
class, содержащий версию кода виртуальной машины программы. Как мы уже отмечали, код виртуальной машины
Java — это промежуточное представление программы, содержащее инструкции, которые будет выполнять виртуальная машина Java. Следовательно, результат работы компилятора j avac не является непосредственно исполняемым кодом.
Чтобы действительно выполнить программу, необходимо воспользоваться программой запуска приложений Java, которая носит имя java. При этом ей потребуется передать имя класса
Example в качестве аргумента командной строки, как показано в следующем примере При выполнении программы на экране отобразится следующий вывод.
Простая программа В процессе компиляции исходного кода каждый отдельный класс помещается в собственный выходной файл, названный по имени класса и получающий расширение
.class. Именно поэтому исходным файлам Java целесообразно присваивать имена, совпадающие с именами классов, которые они содержат, — имя исходного файла будет совпадать с именем файла с расширением
.class. При запуске j ava описанным способом в командной строке в действительности указывают имя класса, который нужно выполнить. Программа будет автоматически искать файл с указанным именем и расширением
.class. Если программа найдет файл, она выполнит код, содержащийся в указанном классе.
Более подробное рассмотрение первого примера программы
Хотя программа
Example, java небольшая, с ней связано несколько важных особенностей, характерных для всех программ Java. Давайте рассмотрим каждую часть этой программы более подробно. Программа начинается со следующих срок.
/*
Это простая программа Java.

6 0 Часть I. Язык Назовите этот файл "Этот фрагмент кода — комментарий.
Подобно большинству других языков программирования, Java позволяет вставлять примечания в исходный файл программы. Компилятор игнорирует содержимое комментариев. Эти комментарии описывают или поясняют действия программы для любого, кто просматривает исходный код. В данном случае комментарий описывает программу и напоминает, что исходный файл должен быть назван E x a m p le . j av a. Конечно, в реальных приложениях комментарии служат, главным образом, для пояснения работы отдельных частей программы или действий, выполняемых отдельной функцией.
В Java поддерживается три стиля комментариев. Комментарий, приведенный вначале программы, называют многострочным комментарием.
Этот тип комментария должен начинаться с символов / * и заканчиваться символами * /. Весь текст, помещенный между этими двумя символами, компилятором игнорируется. Как следует из его названия, многострочный комментарий может содержать несколько строк.
Следующая строка программы имеет такой вид Example В этой строке ключевое слово c l a s s используется для объявления о том, что выполняется определение нового класса. E xam ple — это идентификатор, являющийся именем класса. Все определение класса, в том числе его членов, будет размещаться между открывающей ({) и закрывающей (}) фигурными скобками. Пока мы не станем подробно останавливаться на рассмотрении особенностей реализации класса. Отметим только, что в среде Java все действия программы осуществляются внутри класса. В этом состоит одна из причин того, что все программы Java по крайней мере, частично) являются объектно-ориентированными.
Следующая строка программы — однострочный комментарий Программа начинается с обращения к Это второй тип комментариев, поддерживаемый языком Java. Однострочный
комментарий
начинается с символов / / и завершается концом строки. Как правило, программисты многострочные комментарии используют для вставки длинных примечаний, а однострочные — для коротких, построчных описаний. Третий тип комментариев — комментарий документации- будет рассмотрен далее в этой главе в разделе “Комментарии”.
Следующая строка кода выглядит так static void main(String a r g s [ ]) Она начинается с метода m ain (). Как видно из предшествующего ей комментария, выполнение программы начинается с этой строки. Выполнение всех приложений Java начинается с вызова метода m ain (). Пока мы не можем раскрыть смысл каждого элемента этой строки подробно, поскольку для этого требуется четкое представление о подходе Java к инкапсуляции. Однако поскольку эта строка кода присутствует в большинстве примеров этой части книги, давайте кратко рассмотрим ее.
Ключевое слово p u b l i c — модификатор доступа, который позволяет программисту управлять видимостью членов класса. Когда члену класса предшествует ключевое слово p u b l i c , этот член доступен коду, расположенному вне класса, в котором определен данный член. (Противоположное ему по действию ключевое слово — p r i v a t e , которое препятствует использованию члена класса кодом, определенным вне его класса) В данном случае метод m a i n ( ) должен быть опреде­
Глава 2. Обзор языка лен как p u b l i c , поскольку при запуске программы он должен вызываться кодом, определенным вне его класса. Ключевое слово static позволяет вызывать метод ma i n () без конкретизации экземпляра класса. Это необходимо потому, что метод ma i n () вызывается виртуальной машиной Java до создания каких-либо объектов. Ключевое слово v o i d просто сообщает компилятору, что метод ma i n () не возвращает никаких значений. Как будет показано в дальнейшем, методы могут также возвращать значения. Не беспокойтесь, если все сказанное кажется несколько сложным. Все эти концепции подробно рассматриваются в последующих главах.
Как было отмечено, main() — это метод, вызываемый при запуске приложений Java. Не забывайте, что язык Java чувствителен к регистру символов. Следовательно, строка
Main неэквивалентна строке main. Важно понимать, что компилятор Java будет выполнять компиляцию классов, не содержащих метод main ()
. Но программа запуска приложений
(java) не имеет средств запуска таких классов. Поэтому, если бы вместо main мы ввели
Main, компилятор все равно выполнил бы компиляцию программы. Однако программа запуска приложений j ava сообщила бы об ошибке, поскольку не смогла бы найти метод main (Для передачи любой информации, необходимой методу, служат переменные, указываемые в скобках, которые следуют за именем метода. Эти переменные называют параметрами Если для данного метода никакие параметры не требуются, следует указывать пустые скобки. Метод main
() содержит только один параметр, но достаточно сложный. Часть
String args
[ ] объявляет параметр args, который представляет собой массив экземпляров класса
String. Массивы —
это коллекции аналогичных объектов) Объекты типа
String хранят символьные строки. В данном случае параметр args принимает любые аргументы командной строки, присутствующие вовремя выполнения программы. В данной программе эта информация не используется, нов других программах, рассмотренных позже, она будет применяться.
Последним элементом строки является символ фигурной скобки ({). Он обозначает начало тела метода main ()
. Весь код, образующий метод, будет располагаться между открывающей и закрывающей фигурными скобками метода.
Еще один важный момент метод ma i n () служит всего лишь началом программы. Сложная программа может включать десятки классов, только один из которых должен содержать метод m a i n ( ) , чтобы выполнение было возможным. Кроме того, в некоторых случаях метод ma i n () вам ненужен вообще, например, при создании аплетов. Эти программы Java, внедренные в веб-браузеры, не используют метод ma i n (), поскольку в них применяются другие средства запуска выполнения.
Следующая строка кода приведена ниже. Обратите внимание на то, что она помещена внутри метода main (Простая программа Эта строка выводит на экран строку текста Простая программа, за которой следует новая строка. В действительности вывод выполняется встроенным методом println
( ). В данном случае метод println
() отображает переданную ему строку. Как будет показано, этот метод можно применять для отображения и других типов информации. Строка начинается с идентификатора потока
System.out. Хотя он слишком сложный, чтобы его можно было подробно пояснить на данном этапе, если говорить вкратце,
System
— это предопределенный класс, который предоставляет доступ к системе, а его переменная-член out
— выходной поток, связанный с консолью.
Как легко догадаться, в реальных программах Java консольный вывод-ввод используется не очень часто. Поскольку многие современные компьютерные среды по своей природе являются оконными и графическими, в большинстве случаев консольный ввод-вывод применяется в простых служебных и демонстрационных

6 Часть I. Язык программах. Позднее мы рассмотрим другие способы вывода в языке Java, а пока продолжим применять методы консольного ввода-вывода.
Обратите внимание оператор, использующий метод print
In ()
, завершается точкой с запятой. В Java все операторы заканчиваются этим символом. Причина отсутствия точки с запятой в конце остальных строк программы в том, что с технической точки зрения они не являются операторами.
Первый символ } завершает метода последний — определение класса Второй пример короткой программы

Вероятно, ни одна другая концепция не является для языка программирования столь важной, как концепция переменных. Как вы, вероятно, знаете, переменная — это именованная ячейка памяти, которой может быть присвоено значение внутри программы. Вовремя выполнения программы значение переменной может изменяться. Следующая программа демонстрирует способы объявления переменной и присвоения ей значения. Она иллюстрирует также некоторые новые аспекты консольного вывода. Как следует из комментариев вначале программы, этому файлу нужно присвоить имя
Examp е .
j Это еще один короткий пример.

Назовите этот файл "Example2.java".
*/
class Example2 {
public static void main(String a r g s []) {
int num;
// эта строка объявляет переменную по имени num
num = 100; // эта строка присваивает переменной num значение Это переменная num: " + num);
num = num * Значение переменной num * 2 равно "При запуске этой программы на экране отобразится следующий вывод.
Это переменная num: Значение переменной num * 2 равно 2 Рассмотрим создание этого вывода подробнее. Первая строка этой программы еще незнакома читателю num;
// эта строка объявляет переменную по имени Она объявляет целочисленную переменную num.
Java (подобно большинству других языков) требует, чтобы переменные были объявлены до их использования. Ниже приведена общая форма объявления переменных.
тип имя_пер еменной
;
В этом объявлении тип указывает тип объявляемой переменной, а имя переменной имя переменной. Если нужно объявить несколько переменных заданного типа, можно использовать разделенный запятыми список имен пере
Глава 2. Обзор языка Java
6 3
менных. Java определяет несколько типов данных, в том числе целочисленный, символьный и с плавающей точкой. Ключевое слово int указывает целочисленный тип. В приведенном примере программы строка = 100; // эта строка присваивает переменной num значение, равное присваивает переменной num значение
100. В Java оператором присваивания служит одиночный знак равенства.
Следующая строка кода выводит значение переменной num, которому предшествует текстовая строка " Это переменная num:
"Это переменная num: " + В этом операторе знак плюс вызывает дописывание значения переменной num вконец предшествующей строки и вывод результирующей строки. (В действительности значение переменной num вначале преобразуется из целочисленного в строковый эквивалента затем объединяется с предшествующей строкой. Подробнее этот процесс описан в последующих разделах книги) Этот подход можно обобщить. Используя оператор +, внутри одного вызова метода print­
ln
() можно объединять необходимое количество строк.
Следующая строка кода присваивает переменной num значение этой переменной, умноженное на 2. Как ив большинстве других языков, в Java оператор * служит для указания операции умножения. После выполнения этой строки кода переменная num будет содержать значение
2 Следующие две строки программы выглядят так r i n t (Значение переменной num * 2 равно "В них выполняется несколько новых действий. Метод print
() используется для отображения строки " Значение переменной num * 2 равно. За этой строкой наследует символ новой строки. Таким образом, следующий вывод будет отображаться в той же строке. Метод print (
) подобен методу println ()
, за исключением того, что после каждого вызова он не создает символ новой строки. Теперь рассмотрим вызов метода println
(). Обратите внимание на то, что имя переменной num используется само по себе. Методы print
() и println
() могут применяться для вывода значений любых встроенных типов Два управляющих оператора

Хотя управляющие операторы подробно рассматриваются в главе 5, здесь мы кратко рассмотрим два управляющих оператора, чтобы их можно было использовать в примерах программ, приведенных в главах 3 и 4. Кроме того, они послужат хорошей иллюстрацией важного аспекта Java — блоков кода.
Оператор i Работа оператора if в Java во многом аналогична работе оператора IF любого другого языка. Более того, его синтаксис идентичен синтаксису операторов if в языках Си С. Простейшая форма этого оператора выглядит следующим образом условие) оператор

6 4 Часть I. Язык Здесь условие булево выражение. Если условие истинно, оператор выполняется. Если условие ложно, оператор игнорируется. Рассмотрим следующий пример < 100) S y s t e m .o u t .p r i n t l n ( "num меньше 1 0 0 " ) В данном случае, если переменная num содержит значение меньше 100, условное выражение истинно и программа выполнит метод p r i n t l n ( )
. Если переменная num содержит значение, которое больше или равно 100, программа пропустит вызов метода p r i n t l n ( ) Как будет показано в главе 4, в языке Java определен полный набор операторов сравнения, которые могут быть использованы в условном выражении. Некоторые из них перечислены в табл. Таблица 2.1. Некоторые операторы сравнения

Оператор
Значение
<
Меньше
>
Больше
==
Равно
Обратите внимание символом проверки равенства служит двойной знак ра- венства.
Ниже приведен пример программы, иллюстрирующий применение оператора i Демонстрирует применение оператора Назовите этот файл "I f S a m p l e .j a v a " .

*/
class IfSample {
public static voi d ma in ( St r in g a r g s []) {
int x, y;
x = У = 20;
if(x < y) S y s t e m .o u t .p r i n t l n ("x меньше у
x = x * 2 ;
if(x == y) S y s t e m . o u t . p r i n t l n ("x теперь равна у
x = x * 2 ;
if(x > у) S y s t e m . o u t . p r i n t l n ("x теперь больше у этот оператор не будет ничего отображать увы не увидите это");
}
}
Эта программа создает следующий вывод.
х меньше ух теперь равна ух теперь больше у
Обратите внимание еще на одну особенность этой программы. Строках, у;

объявляет две переменные хи у, используя при этом разделенный запятой список
Глава 2. Обзор языка Java
6 Цикл f o Как вам, возможно, известно из уже имеющегося опыта программирования, операторы цикла — важная составная часть практически любого языка программирования. Язык Java — не исключение в этом отношении. Фактически, как будет показано в главе 5, Java поддерживает обширный набор операторов цикла. Иве роятно, наиболее универсальный из них — цикл f o r . Простейшая форма этого цикла имеет такой вид
(начальное_значение; условие приращение) оператор;
В этой наиболее часто встречающейся форме параметр начальное значение определяет начальное значение управляющей переменной цикла. Условие это булево выражение, которое проверяет значение управляющей переменной цикла. Если результат проверки условия истинен, выполнение цикла f o r продолжается. Если результат проверки ложен, выполнение цикла прекращается. Выражение приращение определяет изменение управляющей переменной на каждой итерации цикла. Ниже показан пример короткой программы, иллюстрирующий применение цикла f o r Демонстрирует применение цикла Назовите этот файл "ForTest.java".
*/
class ForTest {
public static void main(String args[]) {
int x;
for(x = 0; x<10; x = Значение x: " + x) Эта программа создает следующий вывод.
Значение х :
0 Значение х 1
Значение х 2 Значение х :
3 Значение х 4 Значение х 5 Значение х 6 Значение х :
7 Значение х 8 Значение х В этом примере х — управляющая переменная цикла. В части инициализации цикла ей присвоено начальное значение, равное нулю. Вначале каждой итерации включая первую) выполняется проверка условиях. Если результат этой проверки истинен, программа выполняет метода затем итерационную часть цикла. Процесс продолжается до тех пор, пока результат проверки условия не станет ложным.
Следует отметить, что в профессионально написанных программах Java вы почти никогда не встретите итерационную часть цикла в том виде, какой она имеет в приведенном примере. Иными словами, операторы вроде следующего встречаются весьма редко.
х = х + 1;
1
3

6 6 Часть I. Язык Это объясняется тем, что Java предоставляет специальный, более эффективный оператор инкремента значения ++ (два последовательных знака плюс. Оператор инкремента значения увеличивает значение операнда на единицу. Используя этот оператор, предшествующее выражение можно было бы переписать следующим образом.
х++ Таким образом, как правило, цикл f o r предшествующей программы будет иметь примерно такой вид = 0; х < 10; х+
+ Можете проверить выполнение этого цикла и убедиться, что он работает точно также, как в предшествующем примере.
Язык Java предоставляет также оператор декремента значений Этот оператор уменьшает значение операнда на единицу.
Использование блоков кода
Язык Java позволяет группировать два и более операторов в блоки кода Для этого операторы заключают в фигурные скобки. Сразу после создания блок кода становится логическим модулем, который можно использовать в тех же местах, что и отдельный оператор. Например, блок может служить в качестве цели для операторов i f и f o r . Рассмотрим следующий оператору начало блоках у;

У = 0;
}
// конец блока
В этом примере, если значение переменной х меньше у, программа выполнит оба оператора, расположенные внутри блока. Таким образом, оба оператора внутри блока образуют логический модуль, и выполнение одного оператора невозможно без одновременного выполнения и второго. Основная идея этого подхода в том, что во всех случаях, когда требуется логически связать два или более операторов, используется блок.
Рассмотрим еще один пример. В следующей программе блок кода использован в качестве целевого модуля цикла f o r Демонстрирует использование блока кода.

Назовите этот файл "BlockTest.java"
*/
class BlockTest {
public static void main(String a r g s []) {
int x, У = 20;
// целевой модуль этого цикла - блок
for(x = 0; х х) {
System, out .println (1
1
Значение х " + х) Значение у " + у);
У = У " 2;
}
Глава 2. Обзор языка Java
6 Эта программа создает следующий вывод.
Значение х:
0
Значение У Значение х : Значение У Значение х:
2
Значение У Значение х : Значение У Значение х : Значение У Значение х : Значение У Значение х : б
Значение У Значение х : Значение У : Значение х : Значение У Значение х : Значение У В данном случае цель цикла for
— блок кода, а не единственный оператор. Таким образом, при каждой итерации цикла программа будет выполнять три оператора, помещенные внутрь блока. Естественно, об этом свидетельствует и вывод программы.
Как будет показано в последующих главах книги, блоки кода обладают дополнительными свойствами и областями применения. Однако их основное назначение — создание логически неразрывных модулей кода.
Вопросы лексики
Теперь, когда читатели ознакомились с несколькими короткими программами
Java, пора более формально описать основные элементы языка. Программы на языке Java представляют собой коллекцию пробелов, идентификаторов, литералов, комментариев, операторов, разделителей и ключевых слов. Операторы рассматриваются в следующей главе, а остальные элементы описаны в последующих разделах данной главы.
Отступ
Java — язык свободной формы. Это означает, что при написании программы ненужно следовать никаким специальным правилам в отношении отступов. Например, программу
Example можно было бы записать в виде одной строки или любым другим способом. Единственное обязательное требование — наличие, по меньшей мере, одного пробела между всеми лексемами, которые еще не разграничены оператором или разделителем. В языке Java отступами являются символы пробела, табуляции или символы новой строки

6 8 Часть I. Язык Java
Идентификаторы
Для именования классов, методов и переменных используются идентификаторы. Идентификатором может служить любая последовательность строчных и прописных букв, цифр или символов подчеркивания и доллара. (Для общего использования символ доллара не предназначается) Идентификаторы не должны начинаться с цифры, чтобы компилятор не путал их с числовыми константами. Повторим еще раз, что язык Java чувствителен к регистру символов, и поэтому
VALUE и
Value
— различные идентификаторы. Ниже приведено несколько примеров допустимых идентификаторов count а Следующие идентификаторы недопустимы high-temp
Not/ok
Литералы
В Java постоянное значение задается его литеральным представлением. Например, ниже показано несколько литералов 98.6 1
X 1
"This is a Первый литерал указывает целочисленное значение, следующий — значение с плавающей точкой, третий — символьную константу, а последний — строковое значение. Литерал можно использовать везде, где допустимо использование значений данного типа.
Комментарии
Как уже было отмечено, в Java определено три типа комментариев. Два из них мы уже встречали однострочные и многострочные. Третий тип называется комментарием документации Этот тип комментариев используется для создания файла
HTML документации программы. Комментарий документации начинается с символов / * * и заканчивается символами * /. Подробнее комментарии документации описаны в приложении.
Разделители
Java допускает применение нескольких символов в качестве разделителей. Чаще всего в качестве разделителя используется точка с запятой. Как вы уже видели, она применяется для завершения строк операторов. Допустимые символы- разделители описаны в табл. Таблица 2.2. Допустимые символы-разделители

Символ
Название
Назначение
( ) Круглые скобки
Используются для передачи списков параметров в определениях и вызовах методов. Их применяют также для определения приоритета в выражениях, выражений в управляющих операторах и преобразования типов
Окончание табл. Глава 2. Обзор языка Java
6 Символ Название Назначение Фигурные скобки
Используются для указания значений автоматически инициализируемых массивов. Их применяют также для определения блоков кода, классов, методов и локальных областей видимости Квадратные скобки
Используются для объявления типов массивов, а также при обращении к значениям массивов
;
Точка с запятой
Завершает операторы '
Запятая
Разделяет последовательные идентификаторы в объявлениях переменных. Этот символ-разделитель используют также для создания цепочек операторов внутри оператора
for
Точка
Используется для отделения имен пакетов от имен вложенных пакетов и классов, а также для отделения переменной или метода от ссылочной переменной
Ключевые слова В настоящее время в языке Java определено 50 ключевых слов (табл. 2.3). Эти ключевые слова, в сочетании с синтаксисом операторов и разделителями, образуют основу языка Java. Их нельзя использовать нив качестве идентификаторов, ни для имен переменных, классов или методов.
Ключевые слова const и goto зарезервированы, ноне используются. На начальном этапе разработки языка Java еще несколько ключевых слов были зарезервированы для возможного использования в будущем. Однако в настоящее время спецификация языка Java определяет только ключевые слова, перечисленные в табл. Таблица 2.3. Ключевые слова Кроме ключевых слов, в Java зарезервированы также слова true, false и null. Они представляют значения, определенные спецификацией языка Java. Их нельзя использовать в качестве имен переменных, классов и т.п.

7 0 Часть I. Язык Библиотеки классов В приведенных в этой главе примерах программ использовались два встроенных метода Java: p r i n t l n () и p r i n t (). Как уже говорилось, эти методы являются членами класса System , который представляет собой стандартный класс Java, автоматически включаемый в программы. В более широком смысле д построена на основе нескольких встроенных библиотек классов, содержащих множество встроенных методов, которые предоставляют поддержку выполнения таких задач, как ввод-вывод, обработка строк, сетевая обработка и обработка графики. Стандартные классы предлагают также поддержку оконного вывода. Таким образом, в целом среда Java представляет собой сочетание самого языка Java и его стандартных классов. Как будет показано, библиотеки классов предоставляют большую часть функциональных возможностей, обеспечиваемых средой Java. Действительно, в определенной степени стать программистом на Java означает научиться использовать стандартные классы Java. В главах этой части описание различных элементов стандартных библиотечных классов и методов приводится по мере необходимости, а в части
II библиотеки классов описаны более подробно

1   2   3   4   5   6   7   8   9   ...   90


написать администратору сайта