|
Создание приложений и аплетов на языке Java
Часть 1
АННОТАЦИЯ
Книга представляет собой первую часть практического пособия по созданию
автономных приложений и аплетов, работающих под управлением навигаторов WWW, на
языке программирования Java.
Описаны основные отличия языка программирования Java от С++, среда
выполнения приложений Java, приемы работы в интегрированной среде Microsoft
Visual J++, основные библиотеки классов Java и методики их использования с
иллюстрацией на примерах конкретных приложений. Читатель научится создавать
сложные интерактивные аплеты для страниц серверов WWW.
Эта книга будет полезна всем, кто начинает самостоятельно осваивать новый
язык программирования Java, и может быть использована в качестве учебного
пособия для студентов учебных заведений.
ВВЕДЕНИЕ
Казалось бы, на сегодняшний день изобрели уже все языки программирования,
какие только можно придумать. Но нет - появился еще один, с названием Java.
Этот язык сумел завоевать весьма заметную популярность за последние несколько
лет, так как он ориентирован на самую популярную компьютерную среду - сеть
Internet и серверы WWW.
Язык Java произошел от языка программирования Oak (а не от С++, как думают
многие). Oak был приспособлен для работы в Internet и затем переименован в Java.
Изучая Java, вы будете приятно удивлены тем, что его синтаксис близок к
синтаксису языка C++. Унаследовав самое лучшее от языка программирования C++,
язык Java при этом избавился от некоторых недостатков С++, в результате чего на
нем стало проще программировать. В этом языке нет, например, указателей,
которые сложны в использовании и потенциально могут послужить причиной доступа
программы к не принадлежащей ей области памяти. Нет множественного наследования
и шаблонов, хотя функциональные возможности языка Java от этого не пострадали.
Если вы умеете программировать на C++, для вас не составит особого труда
изучить язык Java.
Огромное преимущество Java заключается в том, что на этом языке можно
создавать приложения, способные работать на различных платформах. К сети
Internet подключены компьютеры самых разных типов - совместимые с IBM PC,
компьютеры фирмы Apple, рабочие станции Sun и так далее. Даже в рамках
компьютеров, созданных на базе процессоров Intel, существует несколько платформ,
например, Microsoft Windows версии 3.1, Microsoft Windows 95,. Microsoft
Windows NT, IBM OS/2, Solaris, различные разновидности операционной системы
UNIX с графической оболочкой X-Windows. Между тем, создавая сервер WWW в сети
Internet, вы бы наверняка хотели, чтобы им могло пользоваться как можно большее
число людей. В этом случае вас выручат мультиплатформные приложения Java, не
зависящие от конкретного типа процессора и операционной системы.
Программы, составленные на языке программирования Java, можно разделить по
своему назначению на две большие группы.
К первой группе относятся приложения Java, предназначенные для автономной
работы под управлением специальной интерпретирующей машины Java. Реализации
этой машины созданы для всех основных компьютерных платформ.
Вторая группа - это так называемые аплеты (applets). Аплеты представляют
собой разновидность приложений Java, которые интерпретируются виртуальной
машиной Java, встроенной в навигаторы WWW, такие как Microsoft Internet
Explorer или Netscape Navigator.
Приложения, относящиеся к первой группе (в нашей книге мы будем называть их
просто приложениями Java), это обычные автономные программы. Так как они не
содержат машинного кода и работают под управлением специального интерпретатора,
их производительность заметно ниже, чем у обычных программ, составленных,
например, на языке программирования C++. Однако не следует забывать, что
программы Java без перетрансляции способны работать на любой платформе, что
само по себе имеет большое значение в плане разработок для Internet.
Аплеты Java встраиваются в документы HTML, хранящиеся на сервере WWW. С
помощью аплетов вы можете сделать страницы сервера WWW динамичными и
интерактивными. Аплеты позволяют выполнять сложную локальную обработку данных,
полученных от сервера WWW и введенных пользователем с клавиатуры. Из
соображений безопасности аплеты (в отличие от обычных приложений Java) не имеют
никакого доступа к файловой системе локального компьютера. Все данные для
обработки они могут получить только от сервера WWW. Более сложную обработку
данных можно выполнять, организовав взаимодействие между аплетами и
расширениями сервера WWW - приложениями CGI и ISAPI.
Для повышения производительности приложений Java в навигаторе Microsoft
Internet Explorer использована технология с названием Just-in-Time Compilation,
или JIT. При первой загрузке аплета его код транслируется в обычную исполнимую
программу, которая сохраняется на диске и запускается. В результате общая
скорость выполнения аплета Java увеличивается в несколько раз.
Язык Java является объектно-ориентированным и поставляется с достаточно
объемной библиотекой классов. Так же как и библиотеки классов систем разработки
приложений на языке С++, такие как Microsoft Foundation Classes (MFC),
библиотеки классов Java значительно упрощают разработку приложений, представляя
в распоряжение программиста мощные средства решения распространенных задач.
Поэтому программист может больше внимания уделить решению прикладных задач, а
не таких, как, например, организация динамических массивов, взаимодействие с
операционной системой или реализация элементов пользовательского интерфейса.
Первоначально средства разработки приложений и аплетов Java были созданы
фирмой Sun и до сих пор эти средства пользуются популярностью. В сети Internet
по адресу http://www.sun.com есть сервер фирмы Sun, с которого можно бесплатно
получить набор Java Development Kit (JDK). В JDK входят пакетные программы для
компиляции исходных текстов приложений Java, виртуальная машина, программа
автоматизированного создания документации по классам, справочник по классам
Java и другие необходимые средства.
Для тех, кто привык пользоваться средствами разработки корпорации Microsoft,
мы можем порекомендовать SDK-Java - пакетное средство разработки приложений и
аплетов Java, расположенное на сервере http://microsoft.com. В составе этого
средства есть также комплект документации по классам Java в виде набора
документов HTML. Вы можете переписать себе SDK-Java бесплатно с указанного
сревера Microsoft.
Если вы привыкли к интегрированным средствам разработки приложений, таким
как Microsoft Visual C++, инструментарий JDK и SDK-Java могут показаться вам
неудобными. В этом случае вы можете воспользоваться такими системами разработки
приложений Java, как, например, Symantec Cafe или Microsoft Visual J++.
Мы рассмотрим недорогое, но удобное и мощное интегрированное средство
разработки приложений Microsoft Visual J++. Оценочную версию этого средства
можно бесплатно получить с сервера WWW корпорации Microsoft. Заметим, что эта
оценочная версия не содержит внутри себя “бомбы”, уничтожающей программу через
заданное время, и вы сможете оценивать ее достаточно долго. Стоимость
коммерческой версии Microsoft Visual J++ невелика, особенно с учетом того, что
в коробке вы найдете прекрасную книгу Стефана Дэвиса “Learn Java Now” (на
английском языке) издательства Microsoft Press. Если вы работаете с Microsoft
Visual C++, то после установки Microsoft Visual J++ вы получите единую среду
для разработки на языках программирования C++ и Java, что очень удобно.
На прилавках книжных магазинов вы можете найти несколько переводных книг,
посвященных программированию на языке Java. Практически все они ориентированы
на инструментарий JDK, созданный фирмой Sun, и содержат более или менее
подробное описание классов Java. В нашей книге мы научим вас работать с
Microsoft Visual J++ и приведем все сведения, необходимые для разработки как
автономных приложений, так и аплетов Java.
При изложении материала мы будем предполагать, что вы знакомы с языком
программирования C++. Наша книга не является учебником по языку Java. Мы будем
рассказывать о том, как использовать язык Java и систему разработки Microsoft
Visual J++ для создания автономных приложений и аплетов Java, как организовать
взаимодействие аплетов с сервером WWW (во второй части этой книги). При этом мы
будем считать, что с основами языка Java вы знакомы.
Что вам потребуется для работы с книгой?
Очень хорошо, если вы подключены к сети Internet или имеете возможность хотя
бы эпизодической работы в этой сети. В этом случае вам будет доступна
бесплатная оценочная версия Microsoft Visual J++, другие бесплатные средства
разработки приложений и аплетов Java, грандиозные запасы документации и
примеров программ.
Для проверки работы аплетов вам следует установить навигатор Internet,
способный запускать аплеты Java. Это Microsoft Internet Explorer версии 3.01 и
Netscape Navigator версии 3.0. Заметим, что для запуска аплетов вам не нужно
обязательно подключаться к Internet - вы можете встраивать аплеты в документы
HTML, расположенные на локальном диске вашего компьютера и просматривать эти
документы навигатором просто как локальные файлы.
Автономные приложения Java работают под управлением специального
интерпретатора (виртуальной машины Java), поэтому для их отладки вам также не
потребуется сеть Internet.
Если вы собираетесь проверять работу приложений и аплетов Java,
взаимодействующих с сервером WWW, вы можете воспользоваться собственным
сервером в Internet или в корпоративной сети Intranet (если они у вас есть).
Примеры таких аплетов мы приведем в следующей книге “Библиотеки системного
программиста”, посвященной Java. Можно также установить сервер WWW, входящий в
комплект операционной системы Microsoft Windows NT Workstation версии 4.0, или
Personal Web Service для операционной системы Microsoft Windows 95. Последний
доступен для бесплатной загрузки с сервера http://microsoft.com.
Для того чтобы успешно работать с аплетами Java, вы должны иметь некоторое
представление о серверах WWW и языке гипертекстовой разметки документов HTML.
Поэтому перед чтением этой книги мы рекомендуем вам ознакомится с 29 томом
“Библиотеки системного программиста”, который называется “Сервер Web своими
руками”. В этой книге мы рассказали о том, как сделать собственный сервер WWW в
сети Internet и Intranet, а также привели необходимую информацию о расширениях
сервера WWW, реализованных как приложения CGI и ISAPI.
Базовые знания об Internet, а также описание конкретных способов подключения
к ней в российских условиях вы найдете в 23 томе “Библиотеки системного
программиста”, который называется “Глобальные сети компьютеров. Практическое
введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows
Sockets”. Мы рекомендуем эту книгу для тех, кто только планирует подключиться к
Internet, но еще не вполне осознает, как это можно сделать и для чего это нужно.
Что еще почитать?
Количество книг, посвященных Java, растет катастрофически, особенно за
рубежом. Среди удачных еще раз назовем книгу Стефана Дэвиса с названием “Learn
Java Now”, которая может служить учебником по языку Java для тех, кто никогда
не программировал на С и С++.
Среди переводных книг, которые можно встретить в продаже, отметим книгу
Джона Родли “Создание JAVA-апплетов”. Эта книга рассчитана на серьезных
программистов, хорошо знающих язык программирования Java. Однако для тех, кто
только начинает изучать язык Java, она может оказаться слишком сложной.
Другая книга, заслуживающая внимание, это книга Криса Джамса с названием
“Java”. После небольшого введения, рассчитанного на начинающих, в этой книге
приводится описание более чем дюжины достаточно интересных аплетов с исходными
текстами и комментариями.
В качестве справочника по языку Java и библиотекам классов вы можете
использовать книгу И. Баженовой “Язык программирования Java”, которая вышла в
издательстве АО “Диалог -МИФИ”.
Ну и, конечно, вам следует ознакомиться с различными руководствами по языку
Java, хранящимися в сети Internet. В качестве отправной точки для поиска вы
можете выбрать сервер основного разработчика этого языка - фирмы Sun. Адрес ее
сервера мы уже приводили: http://www.sun.com. Помимо документации и примеров
программ на Java, здесь вы найдете ссылки на другие ресурсы, посвященные этому
языку программирования. Попробуйте также воспользоваться поисковыми серверами,
такими как Jahoo! и Alta Vista, указав в качестве ключевого слово “Java”.
БЛАГОДАРНОСТИ
В работе над книгой нам помогали сотрудники фирмы Interactive Products Inc.
Максим Синев и Сергей Ноженко, у которых мы консультировались по различным
вопросам.
Мы признательны генеральному директору АО “ДиалогНаука” Антимонову Сергею
Григорьевичу и его заместителю Лященко Юрию Павловичу за возможность размещения
информации о наших книгах на сервере Web по адресу http://www.dials.ccas.
ru/frolov, а также за возможность доступа к сети Internet через сервер АО
“ДиалогНаука”.
Мы также благодарим корректора Кустова В. С. и сотрудников издательского
отдела АО “Диалог-МИФИ” Голубева О. А., Голубева А. О., Дмитриеву Н. В.,
Виноградову Е. К., Кузьминову О. А.
КАК СВЯЗАТЬСЯ С АВТОРАМИ
Полную информацию о всех наших книгах серий “Библиотека системного
программиста” и “Персональный компьютер. Шаг за шагом”, а также дискеты к
книгам, статьи и другую информацию вы можете найти в сети Internet на серверах
Web по следующим адресам:
http://www.glasnet.ru/~frolov
http://www.dials.ccas.ru/frolov
Вы можете передать нам свои замечания и предложения по содержанию этой и
других наших книг через электронную почту по адресам:
[email protected]
[email protected]
Если электронная почта вам недоступна, присылайте ваши отзывы в АО
“Диалог-МИФИ” по адресу:
115409, Москва, ул. Москворечье, 31, корп. 2,
тел. 324-43-77
Приносим свои извинения за то что не можем ответить на каждое письмо. Мы
также не занимаемся продажей и рассылкой книг, дискет, рекламы, отдельных
фрагментов наших книг и исходных текстов к книгам, консультациями через
электронную почту. По вопросам приобретения книг и дискет обращайтесь
непосредственно в издательство “Диалог-МИФИ”.
1 НОВЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ
Почему вам нужно изучать новый язык программирования Java?
Если ответить на этот вопрос кратко, то потому, что он специально
ориентирован на самые передовые технологии, связанные с сетью Internet.
Растущая популярность Internet и, в особенности, серверов WWW, создает для
программистов новые возможности для реализации своих способностей. Затратив
всего пару-тройку недель на чтение нашей книги, вы сможете проникнуться
идеологией Java и, как мы надеемся, сумеете по достоинству оценить возможности
этого языка программирования.
В этой главе мы расскажем об основных особенностях Java и библиотеках
классов, которые поставляются в составе систем разработки приложений. После
этого вы поймете, почему этот язык программирования выглядит весьма
привлекательно именно для реализации сетевых проектов в Internet и в
корпоративных сетях Intranet.
Мобильность Java
В свое время вы слышали, что язык программирования С является мобильным в
том смысле, что имеется принципиальная возможность переноса программ,
составленных на этом языке, на различные платформы.
Однако следует отметить, что создание действительно многоплатформных
приложений - непростая задача. К сожалению, дело не ограничивается
необходимостью перекомпиляции исходного текста программы для работы в другой
среде. Много проблем возникает с несовместимостью программных интерфейсов
различных операционных систем и графических оболочек, реализующих
пользовательский интерфейс.
Вспомните хотя бы проблемы, связанные с переносом 16-разрядных приложений
Windows в 32-разрядную среду Microsoft Windows 95 и Microsoft Windows NT. Даже
если вы тщательно следовали всем рекомендациям Microsoft, разрабатывая
приложения так, чтобы они могли работать в будующих версиях Windows, едва ли
вам удасться просто перекомпилировать исходные тексты, не изменив в них ни
строчки. Ситуация еще больше ухудшается, если вам нужно, например, перенести
исходные тексты приложения Windows в среду операционной системы IBM OS/2 или в
оболочку X-Windows операционной системы UNIX. А ведь есть еще компьютеры Apple,
рабочие станции с процессором RISC и другие!
Как нетрудно заметить, даже если стандартизовать язык программирования для
всех платформ, проблемы совместимости с программным интерфейсом операционной
системы значительно усложняют перенос программ на различные платформы. И,
конечно, вы не можете мечтать о том, чтобы загрузочный модуль одной и той же
программы мог работать без изменений в среде различных операционных систем и на
различных платформах. Если программа подготовлена для процессора Intel, она ни
за что не согласится работать на процессоре Alpha или каком-либо другом.
В результате создавая приложение, способное работать на различных платформах,
вы вынуждены фактически создавать несколько различных приложений и
сопровождать их по отдельности.
На рис. 1.1 мы показали, как приложение, изначально разработанное для
Microsoft Windows NT, переносится на платформу Apple Macintosh.
Рис. 1.1. Перенос приложения с платформы Windows NT на платформу Apple
Macintosh
Вначале программист готовит исходные тексты приложения для платформы
Microsoft Windows NT и отлаживает их там. Для получения загрузочного модуля
исходные тексты компилируются и редактируются. Полученный в результате
загрузочный модуль может работать на процессоре фирмы Intel в среде
операционной системы Microsoft Windows NT.
Для того чтобы перенести приложение в среду операционной системы компьютера
Apple Macintosh, программист вносит необходимые изменения в исходные тексты
приложения. Эти изменения необходимы из-за различий в программном интерфейсе
операционной системы Microsoft Windows NT и операционной системы, установленной
в Apple Macintosh. Далее эти исходные тексты транслируются и редактируются, в
результате чего получается загрузочный модуль, способный работать в среде Apple
Macintosh, но не способный работать в среде Microsoft Windows NT.
Программа на языке Java компилируется в двоичный модуль, состоящий из команд
виртуального процессора Java. На настоящий момент созданы только первые модели
физического процессора, способного выполнять эти двоичные команды, однако
интерпретаторы Java имеются на всех основных компьютерных платформах.
Разумеется, на каждой платформе используется свой интерпретатор, или, точнее
говоря, свой виртуальный процессор Java.
Если ваше приложение Java (или аплет) должно работать на нескольких
платформах, нет необходимости компилировать его исходные тексты несколько раз.
Вы можете откомпилировать и отладить приложение Java на одной, наиболее удобной
для вас платформе. В результате вы получите двоичный модуль, пригодный для
любой платформы, где есть виртуальный процессор Java.
Сказанное иллюстрируется на рис. 1.2.
Рис. 1.2. Подготовка приложения Java для работы на разных платформах
Таким образом, приложение Java компилируется и отлаживается только один раз,
что уже значительно лучше. Остается, правда, вопрос - как быть с программным
интерфейсом операционной системы, который отличается для разных платформ?
Здесь разработчиками Java предлагается достаточно неплохое решение.
Приложение Java не обращается напрямую к интерфейсу операционной системы.
Вместо этого оно пользуется готовыми стандартными библиотеками классов,
содержащими все необходимое для организации пользовательского интерфейса,
обращения к файлам, для работы в сети и так далее.
Внутренняя реализация библиотек классов, разумеется, зависит от платформы.
Однако все загрузочные модули, реализующие возможности этих библиотек,
поставляются в готовом виде вместе с виртуальной машиной Java, поэтому
программисту не нужно об этом заботиться. Для операционной системы Microsoft
Windows, например, поставляются библиотеки динамической загрузки DLL, внутри
которых запрятана вся функциональность стандартных классов Java.
Абстрагируясь от аппаратуры на уровне библиотек классов, программисты могут
больше не заботиться о различиях в реализации программного интерфейса
конкретных операционных систем. Это позволяет создавать по-настоящему мобильные
приложения, не требующие при переносе на различные платформы перетрансляции и
изменения исходного текста.
Еще одна проблема, возникающая при переносе программ, составленных на языке
программирования С, заключается в том, что размер области памяти, занимаемой
переменными стандартных типов, различный на разных платформах. Например, в
среде операционной системы Microsoft Windows версии 3.1 переменная типа int в
программе, составленной на С, занимает 16 бит. В среде Microsoft Windows NT
этот размер составляет 32 бита.
Очевидно, что трудно составлять программу, не зная точно, сколько имеется
бит в слове или в байте. При переносе программ на платформы с иной разрядностью
могут возникать ошибки, которые трудно обнаружить.
В языке Java все базовые типы данных имеют фиксированную разрядность,
которая не зависит от платформы. Поэтому программисты всегда знают размеры
переменных в своей программе.
Базовые типы данных
В языке Java определено восемь базовых типов данных, перечисленных ниже:
Тип данныхРазмер занимаемой области памятиЗначение по умолчаниюboolean8false
byte80char16‘x0’short160int320long640float320.0Fdouble640.0D
Для каждого базового типа данных отводится конкретный размер памяти, который,
как мы говорили в предыдущем разделе, не зависит от платформы, на которой
выполняется приложение Java. Фактический размеры памяти, отведенные для
хранения переменной, могут отличаться от приведенных выше, например, для
хранения переменной типа short может быть зарезервировано слово размером 32
бита. Однако язык Java сделан таким образом, что это никак не повлияет на
мобильность приложения. Забегая вперед, скажем, что в языке Java нет указателей,
поэтому вы не можете адресоваться к элементам массива чисел по относительному
смещению этих элементов в оперативной памяти. Следовательно, точный размер
элемента в данном случае не играет никакой роли.
Все базовые типы данных по умолчанию инициализируются, поэтому программисту
не нужно об этом беспокоиться. Вы можете также инициализировать переменные
базовых типов в программе или при их определении, как это показано ниже:
int nCounter = 0;
int i;
i = 8;
Переменные типа boolean могут находиться только в двух состояниях - true и
false, причем эти состояния никаким образом нельзя соотнести с целыми
значениями. Вы не можете, как это было в языке С, выполнить преобразование типа
boolean, например, к типу int - компилятор выдаст сообщение об ошибке.
Переменная типа byte занимает восемь бит памяти и про нее больше нечего
сказать.
Что же касается типа char, то он используется для хранения символов в
кодировке Unicode. Эта кодировка позволяет хранить национальные наборы символов,
что очень удобно для интернациональных приложений, предназначенных для работы
в Internet.
Переменные типа byte, short, int и long являются знаковыми. В языке Java нет
беззнаковых переменных, как это было в языке С.
Приложение Java может оперировать числами в формате с плавающей точкой,
определенным в спецификации IEEE 754. Тип float позволяет хранить числа с
одинарной точностью, а формат double - с двойной.
Переменные базовых типов могут передаваться функциям в качестве параметров
только по значению, но не по ссылке. Поэтому следующий фрагмент кода работать
не будет:
int x;
void ChangeX(int x)
{
x = 5;
}
. . .
x = 0;
ChangeX(x);
После вызова функции ChangeX содержимое переменной x останется равным нулю.
Проблему можно решить, если вместо базовых переменных использовать объекты
встроенных классов, соответствующие базовым переменным. О встроенных классах вы
узнаете из следующего раздела.
Библиотеки классов Java
Если предоставить в распоряжение программиста только язык программирования и
не снабдить его набором готовых модулей, предназначенных для решения самых
распространенных задач, ему придется отвлекаться на множество мелких деталей.
Обычно все профессиональные системы разработки приложений содержат в своем
составе набор стандартных библиотечных функций или библиотеки классов, таких
как Microsoft MFC или Borland OWL. В комплекте со всеми средствами разработки
Java поставляются достаточно развитые библиотеки классов, значительно
упрощающие программирование. В этом разделе мы кратко расскажем о составе и
назначении библиотек классов Java.
Встроенные классы
В языке Java все классы происходят от класса Object, и, соответственно,
наследуют методы этого класса. Некоторые библиотеки классов подключаются
автоматически, и мы будем называть их встроенными. К таким относится, в
частности, библиотека с названием java.lang. Другие библиотеки классов вы
должны подключать в исходном тексте приложения Java явным образом с помощью
оператора import, о котором мы еще расскажем.
Замещающие классы
Очень часто в наших приложениях вместо базовых типов переменных мы будем
использовать объекты встроенных классов, которые называются замещающими
классами (wrapper classes). Ниже мы перечислили названия этих классов и
названия базовых типов данных, которые они замещают:
Базовый тип данныхЗамещающий классbooleanBooleancharCharacterintIntegerlongLong
floatFloatdoubleDouble
Заметим, что для преобразования базовых типов данных в объекты замещающего
класса и обратно вы не можете применять оператор присваивания. Вместо этого
необходимо использовать соответствующие методы замещающих классов, которые мы
будем рассматривать по ходу дела. Полную информацию о классах и методах вы
сможете найти в справочной системе, которая устанавливается вместе с Microsoft
Visual J++, поэтому в нашей книге вы не найдете справочника по классам Java.
Класс String
Класс String предназначен для работы с такими часто встречающимися объектами,
как текстовые строки. Методы этого класса позволяют выполнять над строками
практически все операции, которые вы делали раньше при помощи библиотечных
функций C. Это преобразование строки в число и обратно с любым заданным
основанием, определение длины строки, сравнение строк, извлечение подстроки и
так далее.
Хотя в языке Java не допускается перезагрузка (переопределение) операторов,
для объектов класса Stirng и объектов всех произошедших от него классов сделана
встроенная перезагрузка операторов “+” и “+=”. С помощью этих операторов можно
выполнять слияние текстовых строк, например:
System.out.println(“x = “ + x + ‘\n’);
Здесь в качестве параметра функции println передается текстовая строка,
составленная из трех компонент: строки “x = “, числа x и символа перехода на
следующую строку ‘\n’. Значение переменной x автоматически преобразуется в
текстовую строку (что выполняется только для текстовых строк) и полученная
таким образом текстовая строка сливается со строкой “x = “.
Другие встроенные классы
Среди других встроенных классов отметим класс Math, предназначенный для
выполнения математических операций, таких как взятие синуса, косинуса и
тангенса.
Предусмотрены также классы для выполнения запуска процессов и задач,
управления системой безопасности, а также для решения прочих системных задач.
Библиотека встроенных классов содержит очень важные классы для работы с
исключениями. Эти классы нужны для обработки ошибочных ситуаций, которые могут
возникнуть (и возникают!) при работе приложений или аплетов Java.
Подключаемые библиотеки классов
Ниже мы кратко перечислим подлкючаемые библиотеки классов для того чтобы вы
могли оценить возможности набора классов Java. Подробное описание этих классов
есть в справочной системе Microsoft Visual J++ и в литературе, список которой
приведен в конце книги. Мы же ограничимся описанием тех классов, которые будем
использовать в наших примерах приложений.
Библиотека классов java.util
Библиотека классов java.util очень полезна при составлении приложений, так
как в ней имеются классы для создания таких структур, как динамические массивы,
стеки и словари. Есть классы для работы с генератором псевдослучайных чисел,
для разбора строк на составляющие элементы (токены), для работы с календарной
датой и временем.
Библиотека классов java.io
В библиотеке классов java.io собраны классы, имеющие отношение к вводу и
выводу данных через потоки. Заметим, что с использованием этих классов можно
работать не только с потоками байт, но также и с потоками данных других типов,
например числами int или текстовыми строками.
Библиотека классов java.net
Язык программирования Java разрабатывался в предположении, что им будут
пользоваться для создания сетевых приложений. Поэтому было бы странно, если бы
в составе среды разработки приложений Java не поставлялась библиотека классов
для работы в сети. Библиотека классов java.net предназначена как раз для этого.
Она содержит классы, с помощью которых можно работать с универсальными сетевыми
адресами URL, передавать данные с использованием сокетов TCP и UDP, выполнять
различные операции с адресами IP. Эта библиотека содержит также классы для
выполнения преобразований двоичных данных в текстовый формат, что часто бывает
необходимо.
В качестве примера приложения, составленного на языке программирования Java
и ориентированного на работу в сети Internet, можно привести игру Java Color
Lines (рис. 1.3).
Рис. 1.3. Сетевая игра Java Color Lines, расположенная на сервере http://spektr.
orc.ru
Это сетевая версия извстной игры Lines, которая выполнена в виде нескольких
аплетов, взаимодействующих между собой и между сервером WWW с адресом
http://spektr.orc.ru, на котором они расположены. Так как список имен игроков и
достигнутых ими результатов хранится на сервере, вы можете поучаствовать в
мировом турнире, сразившись с игроками из разных стран.
В следующем томе “Библиотеки системного программиста”, посвященном Java, мы
расскажем о том, как организовать взаимодействие между аплетами и сервером WWW.
Библиотека классов java.awt
Для создания пользовательского интерфейса аплеты Java могут и должны
использовать библиотеку классов java.awt. AWT - это сокращение от Abstract
Window Toolkit (инструментарий для работы с абстрактными окнами).
Классы, входящие в состав библиотеки java.awt, предоставляют возможность
создания пользовательского интерфейса способом, не зависящим от платформы, на
которой выполняется аплет Java. Вы можете создавать обычные окна и диалоговые
панели, кнопки, переключатели, списки, меню, полосы просмотра, однострочные и
многострочные поля для ввода текстовой информации.
Библиотека классов java.awt.image
В среде любой операционной системы работа с графическими изображениями
является достаточно сложной задачей. В 14 томе “Библиотеки системного
программиста”, который называется “Графический интерфейс GDI в MS Windows” мы
детально рассмотрели вопросы, связанные с рисованием графики и обработкой
графических файлов в среде операционной системы Microsoft Windows. Если вы
будете рисовать графические изображения в среде IBM OS/2 или X-Windows, вам,
очевидно, придется использовать другие методики и другой программный интерфейс.
Большую сложность также вызывает разбор заголовков графических файлов, так как
они могут иметь различный формат и иногда содержат неправильную или
противоречивую информацию.
Когда вы программируете на Java, рисование и обработка графических
изображений выполняется намного проще, так как вам доступна специально
предназначенная для этого библиотека классов java.awt.image. Помимо широкого
разнообразия и удобства определенных в ней классов и методов, отметим
способность этой библиотеки работать с графическими изображениями в формате GIF.
Этот формат широко используется в Internet, так как он позволяет сжимать файлы
графических изображений во много раз без потери качества за счет устранения
избыточности.
Библиотека классов java.awt.peer
Библиотека классов java.awt.peer служит для подключения компонент AWT
(например, кнопок, списков, полей редактирования текстовой информации,
переключателей и так далее) к реализациям, зависящим от платформы, в процессе
создания этих компонент.
Библиотека классов java.applet
Как нетрудно догадаться из названия, библиотека классов java.applet
инкапсулирует поведение аплетов Java. Когда вы будете создавать свои аплеты,
вам будет нужен класс Applet, расположенный в этой библиотеке классов.
Дополнительно в библиотеке классов java.applet определены интерфейсы для
подключения аплетов к содержащим их документам и классы для проигрывания
аудиофрагментов.
Указатели, которых нет
Самая большая и шокирующая новость для тех, кто раньше программировал на С,
а теперь занялся изучением Java, это то, что в языке Java нет указателей.
Традиционно считалась, что работать с указателями трудно, а их использование
приводит к повялению трудно обнаруживаемых ошибок. Поэтому разработчики Java
решили отказаться от использования указателей совсем.
Спешим успокоить - вы сможете успешно составлять приложения Java и без
указателей, несмотря на то что вам, возможно, придется немного изменить стиль
программирования.
Вы можете спросить: как же передавать функциям ссылки на объекты, если нет
указателей?
Если вам нужно передать ссылку на переменную базового типа, такого, например,
как int или long, то ничего не получится - мы уже говорили, что переменные
базовых типов передаются по значению, а не по ссылке. Поэтому вы не сможете
напрямую создать на языке Java эквивалент следующей программы, составленной на
языке С:
// Некоторая переменная
int nSomeValue;
// Функция, изменяющая значение переменной,
// заданной своим адресом
void StoreValue(int *pVar, int nNewValue)
{
pVar->nNewValue;
}
. . .
StoreValue(&nSomeValue, 10);
Выход, однако, есть.
Язык Java позволяет использовать вместо указателей ссылки на объекты.
Пользуясь этими ссылками, вы можете адресовать объекты по их имени, вызывая
методы и изменяя значения данных объектов.
Что же касается данных базовых типов, если вам нужно передавать на них
ссылки, то следует заменить базовые типы на соответствующие встроенные классы.
Например, вместо типа int используйте класс Integer, вместо типа long - класс
Long и так далее.
Инициализация таких объектов должна выполняться с помощью конструктора, как
это показано ниже:
Integer nSomeValue;
nSomeValue = new Integer(10);
Первая строка создает неинициализированную ссылку с именем nSomeValue и
типом Integer. При попытке использования такой ссылки возникнет исключение.
Вторая строка создает объект класса Integer, вызывая конструктор. Этот
конструктор определяет начальное значение. После выполнения оператора
присваивания ссылка nSomeValue будет ссылаться на реальный объект класса
Integer и ее можно будет использовать.
Имя объекта nSomeValue типа Integer вы можете передавать функциям в качестве
параметра, причем это будет ссылкой на объект.
Составляя программы на языке С, вы часто использовали указатели для
адресации элементов массивов, созданных статически или динамически в
оперативной памяти. Зная начальный адрес такого массива и тип хранящихся в нем
элементов, вы могли адресоваться к отдельным элементам массива.
В языке Java реализован механизм массивов, исключающих необходимость
использования указателей.
Массивы в Java
Для создания массива вы можете пользоваться квадратными скобками, расположив
их справа от имени массива или от типа объектов, из которых составлен массив,
например:
int nNumbers[];
int[] nAnotherNumbers;
Допустимы оба варианта, поэтому вы можете выбрать тот, который вам больше
нравится.
При определении массивов в языке Java нельзя указывать их размер.
Приведенные выше две строки не вызывают резервирования памяти для массива.
Здесь просто создаются ссылки на массивы, которые без инициализации
использовать нельзя.
Для того чтобы заказать память для массива, вы должны создать
соответствующие объекты с помощью ключевого слова new, например:
int[] nAnotherNumbers;
nAnotherNumbers = new int[15];
Как выполнить инициализацию ячеек таблицы?
Такую инициализацию можно выполнить либо статически, либо динамически. В
первом случае вы просто перечисляете значения в фигурных скобках, как это
показано ниже:
int[] nColorRed = {255, 255, 100, 0, 10};
Динамическая инициализация выполняется с использованием индекса массива,
например, в цикле:
int nInitialValue = 7;
int[] nAnotherNumbers;
nAnotherNumbers = new int[15];
for(int i = 0; i < 15; i++)
{
nAnotherNumbers[i] = nInitialValue;
}
Вы можете создавать массивы не только из переменных базовых типов, но и из
произвольных объектов. Каждый элемент такого массива должен инициализироваться
оператором new.
Массивы могут быть многомерными и, что интересно, несимметричными.
Ниже создается массив массивов. В нулевом и первом элементе создается массив
из четырех чисел, а во втором - из восьми:
int[][] nDim = new int[5][10];
nDim[0] = new int [4];
nDim[1] = new int [4];
nDim[2] = new int [8];
Заметим, что во время выполнения приложения Java виртуальная машина Java
проверяет выход за границы массива. Если приложение пытается выйти за границы
массива, происходит исключение.
Массивы в языке Java являются объектами некоторого встроенного класса. Для
этого класса существует возможность определить размер массива, обратившись к
элементу данных класса с именем length, например:
int[] nAnotherNumbers;
nAnotherNumbers = new int[15];
for(int i = 0; i < nAnotherNumbers.length; i++)
{
nAnotherNumbers[i] = nInitialValue;
}
Для определения размера массива вам не нужен такой оператор как sizeof из
языка программирования С, так как существует другой способ определения размера
массива.
Сборка мусора
Одна из интереснейших особенностей языка программирования Java и среды
выполнения приложений Java заключается в наличии специального процесса сборки
мусора, предназначенного для удаления ненужных объектов из памяти. Эта система
избавляет программиста от необходимости внимательно следить за использованием
памяти, освобождая ненужные более области явным образом.
Создавая объекты в Java, вы можете руководствоваться принципом “Создай и
забудь”, так как система сборки мусора позаботится об удалении ваших объектов.
Объект будет удален из памяти, как только на него не останется ни одной ссылки
из других объектов.
Приоритет процесса сборки мусора очень низкий, поэтому “уборка” среды
выполнения приложений Java не отнимает ресурсы у самих приложений.
Особенности реализации классов в Java
Если вы умеете программировать на языке С++, у вас не возникнет никаких
проблем с программированием на Java, так как эти языки очень похожи. Однако
есть и некоторые отличия, которые следует учитывать. Мы приведем только краткое
перечисление основных отличий. Более подробную информацию вы найдете в
литературе, список которой есть в конце книги.
Определение класса
Для создания классов вы можете использовать только ключевое слово class. Что
же касается union, то это ключевое слово в Java не применяется для создания
классов.
В языке программирования С++ описание класса может быть отделено от его
определения. Для Java это не так - описание класса не допустимо. Все методы
должны быть определены внутри определения класса.
Недопустимо определение вложенных классов.
В Java также нет шаблонов. Вы можете создавать классы только на базе других
классов.
Объект класса создается при помощи ключевого слова new, однако вы не можете
удалить объект явным образом, так как ключевое слово delete языка
программирования С++ в Java не используется.
При определении класса вы не можете указать деструктор. Функции удаления
объектов Java из памяти выполняет система сборки мусора.
Внутри одного исходного файла вы можете определить только один общедоступный
класс public.
Все классы в Java наследуются от класса Object, поэтому для любого объекта
вы можете использовать методы этого класса.
Определение методов
Вы не можете определять методы вне тела класса, создавая таким образом
глобальные функции. Нет также возможности определения вне класса глобальных
данных. Тем не менее, внутри класса можно определять статические методы и поля
(с помощью ключевого слова static), которые будут играть роль глобальных
методов и данных.
Пользуясь ключевыми словами static и final, вы можете определять внутри
классов глобальные константы.
Если в базовом классе метод определен с ключевым словом final, его нельзя
переопределить в дочернем классе, созданном на базе данного метода.
Методы не могут быть определены как inline.
Методы Java могут создавать исключения, вызванные возникновением ошибок или
других событий. Все создаваемые исключения должны либо обрабатываться внутри
метода, либо описываться в определении метода после ключевого слова throws.
Переопределение операторов
В языке С++ вы могли переопределить операторы, такие как +, -, ++ и так
далее. Язык Java не допускает такое переопределение, что сделано для упрощения
программирования. Тем не менее, операторы “+” и “+=” перегружены по умолчанию
для выполнения операции слияния текстовых строк класса String.
Интерфейсы
Интерфейсы создаются при помощи ключевого слова interface таким же образом,
что и классы. Однако в отличие от последних, интерфейсы являются аналогом
абстрактных базовых классов без полей данных и предназначены только для
определений набора методов для решения каких-либо задач, например, добавления
компонент в контейнеры, организации списков, сортировки и так далее.
Вы можете создать свой класс на базе другого класса, указав при этом с
помощью ключевого слова implements, что он реализует тот или иной интерфейс.
При этом наряду с методами базового класса в созданном таким образом классе
будут доступны методы, определенные в интерфейсе.
Ссылки на методы класса
Так как в Java нет указателей, нет возможности ссылаться на методы с помощью
оператора ->. Для ссылки на метод класса используется только оператор “точка”.
Оператор “::” также не определен в Java. Если вам необходимо вызвать метод
из базового класса, следует использовать ключевое слово super.
Наследование
С помощью ключевого слова extends вы можете унаследовать один класс
(дочерний) от другого (базового).
Множественное наследование не допускается. Таким образом, для каждого
дочернего класса может быть только один базовый класс. При необходимости,
однако, этот дочерний класс может реализовывать произвольное количество
интерфейсов.
Для ссылки на методы базового класса вы должны использовать ключевое слово
super.
При необходимости вы можете вызвать в первой исполняемой строке конструктора
дочернего класса конструктор базового класса (опять же с помощью ключевого
слова super).
2 ПЕРВОЕ ПРИЛОЖЕНИЕ И ПЕРВЫЙ АПЛЕТ
Не стремясь быть оригинальными, начнем программирование на Java с
составления простейшей программы, которая выводит текстовую строку “Hello,
Java!”. Для этого вам сначала нужно установить среду разработки Microsoft
Visual J++, запустив программу setup.exe, расположенную в корневом каталоге
дистрибутивного компакт-диска.
Процесс установки не вызывает затруднений. Вы просто должны следовать
инструкциям, появляющимся на экране. Заметим только, что если у вас уже была
установлена система Microsoft Visual C++, то имеет смысл для установки
Microsoft Visual J++ использовать тот же каталог, что был использован для
установки Microsoft Visual C++. При этом формируется единая среда разработки
приложений на языках программирвоания C++ и Java, что очень удобно.
Приложение Hello
Как мы уже говорили, приложения Java могут выполняться под управлением
специального интерпретатора, работающего в рамках отдельного процесса, либо под
управлением навигатора Internet, такого как Microsoft Internet Explorer или
Netscape Navigator. В последнем случае приложение называется аплетом.
Первое приложение, которое мы рассмотрим, относится к простым приложениям,
второе будет аплетом, встроенным в документ HTML.
Подготовка и запуск приложения
Итак, запустите среду Microsoft Developer Studio, сделав двойной щелчок
левой клавишей мыши по соответствующей пиктограмме.
Выберите из меню File строку New. На экране появится диалоговая панель New,
показанная на рис. 2.1.
Рис. 2.1. Диалоговая панель New
В этой диалоговой панели вам нужно выбрать строку Project Workspace и нажать
кнопку OK. Сразу влсед за этим вы увидите диалоговую панлеь New Project
Workspace (рис. 2.2).
Рис. 2.2. Диалоговая панель New Project Workspace
В левой части этой диалоговой панели есть список различных типов проектов,
которые можно создать. К теме нашей книги относятся проекты типа Java Workspace
и Java Applet Wizard. Первый из них предназначен для ручного создания
приложений и аплетов Java, второй позволяет создавать заготовки аплетов Java в
полуавтоматическом режиме.
Выберите проект типа Java Workspace. В поле Location укажите каталог, в
котором будут создаваться проекты, а в поле Name - имя проекта. Переключатель
Java Virtual Machine должен находиться во включенном состоянии.
После заполнения диалоговой панели New Project Workspace нажмите кнопку
Create. Будет создан проект, в котором пока нет ни одного исходного файла.
Далее из меню Insert среды разработки Microsoft Developer Studio выберите
строку Files into Project. В поле Filename наберите имя файла hello.java и
нажмите кнопку Add. На экране появится сообщение о том, что файл с указанным
именем не существует. Вы, однако, можете добавить ссылку на этот файл в проект,
нажав кнопку Yes.
На следующем этапе вы должны открыть папку файлов проекта, отмеченную как
hello files на средней странице блокнота, расположенного в левой части окна
системы разработки (рис. 2.3).
Рис. 2.3. В проект добавлен файл hello.java
Сделайте двойной щелчок по имени файла hello.java. На экране появится
сообщение о том, что файла с указанным именем не существует. Для того чтобы
создать его, нажмите кнопку Yes.
В правой части главного окна системы разработки появится окно редактирования,
в котором вам нужно ввести исходный текст нашей программы, приведенный в
листинге 2.1.
Листинг 2.1. Файл hello\hello.java
public class hello
{
public static void main(String[] args)
{
System.out.println("Hello, Java!\n");
}
}
Затем выберите из меню Build строку Execute. На экране появится сообщение о
том, что запускаемый файл hello.class не существует (рис. 2.4).
Рис. 2.4. Сообщение о том, что файл hello.class не существует
Для создания файла нажмите кнопку Yes. Исходный текст программы будет
откомпиллирован. Если вы ввели его правильно, сообщения об ошибках не появятся.
Затем вы увидите на экране диалоговую панель Information For Running Class,
показанную на рис. 2.5.
Рис. 2.5. Диалоговая панель Information For Running Class
В поле Class file name вам нужно ввести строку hello. Это имя класса и оно
должно в точности соответствовать имени класса, указанному в определении класса
(листинг 2.1), а также имени файла, в котором определен класс.
Заметим, что для каждого класса типа public вы должны создавать отдельный
файл. Имя этого файла должно быть таким же, что и имя класса (с учетом строчных
и прописных букв), а расширение имени файла необходимо указать как class.
Указав имя класса, включите переключатель Stand-alone interpreter в поле Run
project under. При этом ваша программа будет выполняться под управлением
автономного интерпретатора Java jview.exe, который находится в каталоге Windows.
После того как вы нажмете кнопку OK, ваше приложение будет запущено. На
короткое время вы увидите окно интерпретатора Java, в котором появится
сообщение Hello, Java! (рис. 2.6).
Рис. 2.6. Окно интерпретатора Java с сообщением, выведенным нашим приложением
Не огорчайтесь, что это окно быстро исчезло - вы можете запустить программу
под отладкой и наслаждаться видом окна сколько угодно, остановив работу
программы после оператора вывода сообщения. Давайте попробуем сделать это.
Установите курсор на оператор System.out.println("Hello, Java!\n") и нажмите
комбинацию клавиш . Работа программы будет остановлена в момент
достижения указанной строки. На экране появится окно интерпретатора jview.exe,
не содержащее пока никаких сообщений.
Далее выполняйте программу по шагам, нажимая клавишу . После первого
раза в окне интерпретатора появится сообщение Hello, Java!. На второй раз
приложение завершит свою работу и окно интерпретатора Java исчезнет с экрана.
Взгляд на исходный текст приложения Hello
Давайте теперь взглянем еще раз на исходный текст приложения Hello и
посмотрим, что там к чему. Так как этот текст невелик, для удобства приведем
его снова:
public class hello
{
public static void main(String[] args)
{
System.out.println("Hello, Java!\n");
}
}
В приложении определен один класс public с именем hello. Исходный файл
приложения Java может содержать только один класс public, причем имя файла
должно в точности соответствовать имени такого класса. В данном случае исходный
файл называется hello.java. Если бы вы назвали файл Hello.java, компилятор
выдал бы сообщение об ошибке.
В классе hello мы определили один статический метод с именем main.
Статическая функция с этим именем является точкой входа приложения Java, если
она определена с классе public с именем, таким же как и имя файла.
В качестве параметра функции main передается ссылка на массив строк класса
String. Через эти строки вы можете передавать приложению Java параметры запуска.
Как наше приложение выводит текстовую строку на консоль?
В классе System определена переменная класса PrintStream с именем out. В
классе PrintStream определен метод println, при помощи которой наше приложение
выводит сообщение “Hello, Java!” на консоль.
Но где же объект, для которого вызывается метод println? В классе System
поле PrintStream определено как статическое, поэтому методы этого класса можно
вызывать, не создавая объектов класса, чем мы и воспользовались.
Как видите, текст пристейшего приложения Java по своей сложности не намного
превосходит исходный текст программы аналогичного назначения, составленной на
языке программирования С.
Простейший аплет
Аплетами называются приложения Java, которые выполняются под управлением
виртуальной машины Java, встроенной в навигатор, такой как Microsoft Internet
Explorer или Netscape Navigator. Аплет встраивается в документ HTML и выглядит
как окно заранее заданного размера. Он может рисовать в своем окне (и только в
нем) произвольные изображения или текст.
Двоичный файл с исполняемым (а точнее говоря, интерпретируемым) кодом Java
располагается на сервере WWW. В документе HTML с помощью оператора
|
|