Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Секреты программирования для Internet на Java

.pdf
Скачиваний:
181
Добавлен:
02.05.2014
Размер:
3.59 Mб
Скачать

исходным текстом может содержать только один общедоступный класс или интерфейс. Модификатор final означает, что данный класс нельзя расширять, то есть нельзя строить на

его основе новые классы. Некоторые из классов и интерфейсов прикладного программирования Java определены с этим модификатором. Например, классы Array и String определены с модификатором final, поскольку они являются гибридными классами - то есть экземпляры этих классов не являются в полном смысле слова объектами, а часть кода этих классов реализована непосредственно в компиляторе. Обычно объявление класса с модификатором final не имеет большого смысла, так как при этом вы теряете возможность определять подклассы данного класса. Тем самым вы лишаетесь преимуществ объектно-ориентированного подхода, и ни вы сами, ни другие люди не смогут пользоваться написанным вами кодом. Однако модификатор final может быть полезным в некоторых случаях, в которых переносимость и возможность наследования являются нежелательными.

Определяя класс с модификатором abstract, вы тем самым сообщаете компилятору, что один или несколько методов этого класса является абстрактными. Абстрактным методом называется такой, который в момент своего объявления не содержит никакого кода; код может добавляться в этот метод позднее в подклассах данного класса, которые унаследуют этот абстрактный метод. Абстрактный класс не может быть реализован (то есть нельзя создать экземпляр данного класса), но его можно расширять, создавая подклассы и заполняя в них абстрактные методы нужными алгоритмами. Подкласс абстрактного класса обязательно должен либо сам быть объявлен абстрактным, либо реализовать все абстрактные методы. Такой подход удобен в тех случаях, когда на ранних этапах работы ясна структура программы, но еще не выработаны конкретные алгоритмы. Если попытаться объявить целый класс (а не метод) абстрактным, такой класс будет называться интерфейсом (interface). Подробнее об интерфейсах говорится в разделе "Интерфейсы" данной главы, а также в главе 3, "Объектная ориентация в Java".

Ключевое слово extends

Отношение наследования реализуется с помощью ключевого слова extends. Любой класс может расширять (или, иными словами, быть наследником) не более одного другого класса. Таким образом, множественное наследование явным образом в языке Java не поддерживается. Тем не менее использование интерфейсов позволяет реализовать некоторые свойства множественного наследования.

У всех объектов в Java есть один общий класс-родитель, который называется Object. Если в спецификации класса не указан класс-родитель, то по умолчанию вновь создаваемый класс становится подклассом класса Object. Для явного указания класса-родителя применяется ключевое слово extends. Так, если мы определили выше класс foo, мы можем создать его подкласс bar следующим образом:

class bar extends foo {...}

Подкласс наследует все методы и переменные своего класса-родителя. Вы можете переопределить или затенить какие-то из этих переменных и методов, использовав в подклассе соответствующий идентификатор с другим значением. Чтобы при этом получить доступ к затененному идентификатору, можно воспользоваться особой переменной super, которая указывает на класс-родитель, ближайший к данному в иерархии классов. Допустим, что в классе foo есть метод под названием test, а в подклассе bar этот метод затенен созданием другого метода с тем же именем. Чтобы получить доступ к исходному методу test, определенному в foo, нужно прибегнуть к следующей записи:

class bar extends foo { void test() {

super.test(); // вызов метода test, определенного в классе-

родителе (foo.test)

...

}

}

СОВЕТ Попытка определить "порочный круг" зависящих друг от друга классов приведет к сообщению об ошибке при компиляции. Иными словами, класс Б не может быть подклассом А, если класс А уже определен как подкласс класса Б.

Ключевое слово implements

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

Ⱦɚɧɧɚɹ ɜɟɪɫɢɹ ɤɧɢɝɢ ɜɵɩɭɳɟɧɚ ɷɥɟɤɬɪɨɧɧɵɦ ɢɡɞɚɬɟɥɶɫɬɜɨɦ %RRNV VKRS Ɋɚɫɩɪɨɫɬɪɚɧɟɧɢɟ ɩɪɨɞɚɠɚ ɩɟɪɟɡɚɩɢɫɶ ɞɚɧɧɨɣ ɤɧɢɝɢ ɢɥɢ ɟɟ ɱɚɫɬɟɣ ɁȺɉɊȿɓȿɇɕ Ɉ ɜɫɟɯ ɧɚɪɭɲɟɧɢɹɯ ɩɪɨɫɶɛɚ ɫɨɨɛɳɚɬɶ ɩɨ ɚɞɪɟɫɭ piracy@books-shop.com

следует имя интерфейса, должно стоять последним в объявлении класса. Таким образом, полный синтаксис объявления класса таков:

<модификаторы класса> class <имя класса> extends

<имя класса-родителя> implements <имя интерфейса> {...}

В этом объявлении все, кроме ключевого слова class и имени самого определяемого класса, является факультативным. Если класс является реализацией интерфейса, он должен заполнить каким-то кодом методы, определенные в данном интерфейсе. Единственным исключением из этого правила является случай, когда сам определяемый класс является абстрактным; при этом конкретная реализация методов интерфейса может быть переложена на подклассы данного класса.

Допустим, у нас есть интерфейс shapeInterface, который содержит два метода - draw и erase. Тогда мы можем определить класс с именем shape, реализующий этот интерфейс:

class shape implements shapeInterface { void draw() {...}

void erase() {...}

}

Если вы хотите создать класс, реализующий сразу несколько интерфейсов, то имена этих интерфейсов нужно перечислить после ключевого слова implements через запятую. В таком случае создаваемый класс должен реализовать все методы каждого интерфейса. Допустим, мы имеем два интерфейса, называемые shapeInterface и moveableInterface. В этом случае мы можем определить класс dragDrop, реализующий оба этих интерфейса:

class dragDrop implements shapeInterface, moveableInterface {...}

Более содержательное обсуждение интерфейсов вы найдете в главе 3, "Объектная ориентация в Java". Синтаксис объявления интерфейсов приведен ниже в этой главе в разделе "Интерфейсы".

Модификаторы объявления переменных

Определяя внутри класса переменные, вы можете воспользоваться некоторыми из модификаторов. Присутствие этих модификаторов изменяет такие свойства переменных, как доступность их из других классов, поведение переменных в условиях многопотоковости, а также то, является ли переменная статической или конечной (final). В объявлениях переменных можно указывать следующие модификаторы: public, private, protected, static, final, transient и volatile.

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

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

Переменная, объявленная с модификатором protected в некоем классе С, доступна всем классам в данном пакете, а также во всех классах, являющихся подклассом класса С. Иными словами, доступа к этой переменной не имеют те классы, которые не входят в данный пакет и не являются подклассами того класса, в котором эта переменная определена.

Если же переменная в классе С объявлена как private protected, то это означает, что к ней могут получить доступ только подклассы класса С. Другим классам, входящим в тот же пакет, эта переменная недоступна. Таким образом, если вам нужно ограничить сферу действия переменной только самим классом и его подклассами, используйте сочетание ключевых слов private protected.

Наконец, модификатор, сильнее всего ограничивающий доступность переменной, - модификатор private - делает переменную невидимой нигде за пределами данного класса. Даже подклассы данного класса не смогут обращаться к переменной, объявленной как private.

Вот пример, в котором используются все четыре модификатора доступа:

class circle {

public String className; protected int x,y;

private protected float radius; private int graphicsID;

}

www.books-shop.com

Если переменная объявлена с ключевым словом static, это означает, что данная переменная будет общей для всех реализаций этого класса. Место для такой переменной выделяется во время компиляции, поэтому вам не нужно будет создавать экземпляр класса, чтобы получить доступ к этой переменной. Например, таким образом в классе Math пакета java.lang определена переменная-константа PI. Без какой-либо реализации данного объекта мы можем сразу получить доступ к этой переменной:

System.out.println("PI = " + Math.PI);

Модификатор final говорит о том, что значение данной переменной не может быть изменено. Объявление этой переменной обязательно должно содержать инициализацию - присвоение начального значения, а любая попытка изменить значение переменной в других местах программы приведет к сообщению об ошибке при компиляции. Модификатор final обычно используется в определениях констант. Кроме того, неизменяемые константы обычно имеют модификаторы public и static. Так, в некоем классе foo можно определить константу Answer следующим образом:

class foo {

public static final int Answer = 42;

}

Наконец, модификаторы transient и volatile относятся к той части языка, которая отвечает за многопотоковое исполнение программ. Основная цель этих модификаторов - облегчить компилятору оптимизацию многопотокового кода. Переменная, объявленная с ключевым словом transient, не может принадлежать объекту в резидентном состоянии (persistent state). Ключевое слово transient будет использовано для реализации некоторых функций в будущих версиях языка.

Переменная, объявленная как volatile, - это такая переменная, о которой известно, что она может изменяться асинхронно. Переменные, объявленные с этим ключевым словом, будут записываться на свое место в памяти после каждого использования и вновь загружаться по мере необходимости. Ключевые слова transient и volatile зарезервированы для использования в будущем, хотя в программах их можно употреблять уже сейчас. (Подробнее о переменных, объявленных с ключевым словом volatile, вы узнаете в главе 11, "Многопотоковость".)

Модификаторы методов

При объявлении метода могут использоваться модификаторы, перечисленные в табл. 4-13. Из них модификаторы public protected и private действуют точно так же, как и при объявлении переменных, и употребляются для ограничения доступа к методам.

Таблица 4-13. Модификаторы методов public protected private static abstract final native synchronized

Модификатор static позволяет сделать метод доступным даже в том случае, когда класс, к которому он принадлежит, не реализован. Методы, объявленные статическими, неявным образом используют также модификатор final - иными словами, переопределить статический метод невозможно. В пределах статического метода вы можете обращаться только к тем членам данного класса, которые также являются статическими.

Абстрактный метод, определенный с модификатором abstract, - это такой метод, который будет реализован не в экземпляре данного класса, а лишь в каком-то из его подклассов. Если хотя бы один из методов класса является абстрактным, этот класс также становится абстрактным и уже не может быть реализован. Если все методы класса являются абстрактными, то такой класс, вероятно, имеет смысл объявить как интерфейс.

Метод, определенный с модификатором final, не может быть переопределен в подклассе данного класса. По сути, тем же свойством обладает и метод, объявленный с модификатором private, - он также не может быть переопределен. Оптимизирующий компилятор, возможно, будет производить встраивание такого метода для повышения скорости работы программы - это значит, что во все места, где данный метод вызывается, компилятор вместо вызова будет копировать сам код метода. При этом за счет увеличения объема программы иногда удается получить заметный выигрыш в скорости. Многие компиляторы C/C++ также пользуются таким методом оптимизации.

www.books-shop.com

Глава 5

Апплет в работе

Что такое апплет?

Стадии выполнения апплета Доступ к ресурсам Доступ к параметрам

Взаимодействие с пользователем События, генерируемые мышью

События, генерируемые клавиатурой Обработчики событий: что же происходит на самом деле?

Анимация при помощи потоков Интерфейс Runnable

Простые методы для работы с потоками Устранение мерцания

www.books-shop.com

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

В ближайших главах будут объяснены основы написания апплетов. Начнем мы с того, как расширить класс Applet, и опишем важные обходные методы для получения нужного вам поведения апплета. Мы покажем, как использовать методы класса Applet, чтобы получить изображение и звук из сети. Вы узнаете, как получить параметры из HTML-кода, так что ваши апплеты смогут проявлять различные варианты поведения без необходимости перекомпиляции. Мы объясним, как заставить апплет ответить на действия мыши и ввод с клавиатуры. В заключение мы покажем, как оживить апплеты с помощью потоков и как избавить апплеты от раздражающего мерцания.

СОВЕТ Фрагменты кода, приводимые в качестве примеров в этой главе, помещены на диск CDROM, прилагаемый к книге. Этим диском могут пользоваться те из читателей, кто работает с Windows 95/NT или Macintosh; пользователи UNIX должны обращаться к Web-странице Online Companion, на которой собраны сопроводительные материалы к этой книге (адрес http://www.vmedia.com/java.html).

Что такое апплет?

Апплет объединяет в себе элементы сложного графического окна с легкостью использования и возможностями работы с сетями. В сущности, он является миниатюрным графическим интерфейсом пользователя, подобно Microsoft Windows или X11, который, как гарантируют разработчики, будет иметь в основном одни и те же функциональные возможности независимо от типа компьютера, им управляющего.

Апплеты очень полезны для написания прикладных программ для Интернет, потому что они могут быть вложены в HTML-документы и выполняться в броузерах Web, допускающих использование языка Java, - например, Netscape Navigator 2.0. Чтобы создать свои собственные апплеты, нужно расширить класс Applet и сослаться на новый класс на Web-странице. Давайте рассмотрим апплет "Hello World", подобный апплету, которым мы занимались в главе 2, "Основы программирования на Java".

Пример 5-1a. Апплет "Hello World". import java.applet.*;

import java.awt.*;

public class HelloWorldApplet extends Applet { public void init() {

resize(250,250);

}

public void paint(Graphics g) { g.drawString("Hello world!",25,25);

}

}

Апплет "Hello World" расширяет класс Applet, а это означает, что все методы и переменные, доступные классу Applet, доступны и нашему расширению этого класса. К примеру, взяв два из этих методов - init и paint, - мы можем изменить их заданное по умолчанию поведение так, чтобы они делали то, что нам нужно. Рассмотрим HTML-код для Web-страницы, которая содержит апплет "Hello World".

Пример 5-1b. Web-страница "Hello World".

<HTML>

<HEAD>

<TITLE>Hello World Applet</TITLE> </HEAD>

<BODY>

<APPLET CODE="HelloWorldApplet.class" WIDTH=250 HEIGHT=250>

</APPLET>

</BODY>

</HTML>

www.books-shop.com

СОВЕТ Тег <APPLET> не был включен в существующие на момент написания книги стандарты HTML Консорциума W3 (W3C) - авторитетной группы, разрабатывающей стандарты для WWW. Этот синтаксис в настоящее время используется только броузером Netscape Navigator 2.0 и программой просмотра апплетов фирмы Sun, способными интерпретировать Java. Так что это будет, вероятно, нестандартный тег, существующий де-факто подобно другим, не соответствующим стандарту HTML маркировочным тегам, используемым Netscape, - тегам <CENTER> и <BLINK>. W3C в настоящее время предлагает тег <INSERT> для приложений, вставляемых в Web-страницы; последние новости по этой теме вы можете найти по адресу http://flwww.w3.orglpub/WWW/TR/WD-insert.html.

Параметр CODE внутри тега <APPLET> определяет полный URL-адрес к классу компилируемого апплета - здесь мы допускаем, что эта HTML-страница находится в том же самом каталоге, что и класс Hello World. Обратите внимание, что с помощью атрибутов WIDTH и HEIGHT нужно сообщить броузеру, насколько велик этот апплет, чтобы броузер мог правильно сформировать страницу. Под Netscape Navigator 2.0 вы можете задать для этих атрибутов значение 100%, что заставит броузер давать апплету столько места, сколько ему требуется.

Апплеты в Java стилистически отличаются от прикладных программ на других языках программирования. Java-код в значительной степени является событийно управляемым, подобно гипертексту в Web, вместо обычного линейного потока, как в традиционном программировании. Оболочка времени выполнения - Web-броузер - действует как интерфейс между кодом и компьютером, на котором он выполняется. Эта связь представлена на рис. 5-2.

Рис. 5.2.

Оболочка времени выполнения понимает такие методы апплета, как paint и mouseMove, и вызывает их, когда требуется, - например, когда необходимо перерисовать экран или отразить перемещения мыши. По умолчанию при вызове этих методов апплет ничего не делает - программист должен сам переопределять эти методы, если хочет, чтобы апплет ответил на соответствующие события.

Интерфейс AppletContext

Оболочка времени выполнения создает класс Java, который осуществляет интерфейс AppletContext. Интерфейс AppletContext описывает несколько методов, с помощью которых апплеты могут запрашивать ресурсы из оболочки времени выполнения, например методы getImage и getAudioCIip (описанные позже в этой главе). Класс AppletContext наблюдает за событиями и вызывает соответствующие методы для их обработки. Его можно представить как трап между кодом вашего апплета и оболочкой времени выполнения. Апплеты могут запрашивать ссылку на их AppletContext, используя метод getAppletContext. Вам не нужно взаимодействовать с AppletContext непосредственно, если только вы не хотите заставить несколько апплетов общаться друг с другом. Мы опишем, как это делается, в главе 13, "Работа с сетью на уровне сокетов и потоков".

Стадии выполнения апплета

www.books-shop.com

Когда Java-совместимый броузер Web загружает класс Applet, сначала он распределяет память для апплета и глобальных переменных. Затем выполняется метод init. (Вообще, программисты используют метод init, чтобы инициализировать глобальные переменные, получить ресурсы из сети и установить интерфейс пользователя.) После этого броузер вызывает метод start. Если часть броузера, содержащего апплет, видима (что обычно и случается, когда апплет только начинает свою работу), вызывается метод paint. Если пользователь уходит со страницы, содержащей апплет, броузер вызывает метод stop. Когда пользователь возвращается на страницу с апплетом, метод start, так же как и метод paint, вызывается снова. Следующий фрагмент кода иллюстрирует работу апплета в случае, если пользователь покидает страницу и затем возвращается на нее.

Пример 5-2. Апплет, считающий обращения к странице. import java.applet.*;

import java.awt.*;

public class Count extends Applet { int InitCount=0;

int StartCount=0; int StopCount=0; int PaintCount=0; public void init() {

resize(250,75);

InitCount = InitCount + 1;

}

public void start() {

StartCount = StartCount + 1;

}

public void stop() {

StopCount = StopCount + 1;

}

public void paint(Graphics g) { PaintCount++;

String Output = new String( "Inits: "+InitCount+

"Starts: "+StartCount+

"Stops: "+StopCount+

"Paints: "+PaintCount); g.drawString(Output,25,25);

}

}

Вывод апплета после первого запуска показан на рис. 5-3. Апплет один раз был инициализирован, один раз запускался, ни разу не останавливался и, по крайней мере, один раз был перерисован.

Рис. 5.3.

www.books-shop.com

Если вы перейдете к другой Web-странице и затем возвратитесь обратно (без выхода из броузера), вы увидите, что апплет все еще был инициализирован только один раз, но запускался два раза, один раз останавливался и, по крайней мере, дважды перерисовывался. Это отражено на рис. 5-4.

Рис. 5.4.

СОВЕТ Нажатие кнопки Reload в Netscape Navigator 2.0 заставит апплеты на текущей странице остановиться и запуститься снова.

Если вы заслоняете апплет, перемещая другое окно поверх окна с апплетом, а затем снова переводите его наверх, делая активным, вы обнаружите, что апплет не был запущен и не останавливался, но окно с ним было перерисовано. В табл. 5-1 приведены некоторые важные методы класса Applet.

 

Таблица 5-1. Основные методы класса Applet

Метод

Описание

init ()

Вызывается один раз при первой загрузке кода апплета.

start ()

Вызывается всякий раз, когда Web-страница, содержащая апплет, становится в

 

броузере активной.

stop ()

Вызывается, когда Web-страница, содержащая апплет, больше не активна в

 

броузере.

destroy () Вызывается при явном уничтожении апплета.

paint (Graphics Вызывается, когда апплет должен повторно вывести графическое окно. g)

Замещение метода destroy

Апплеты могут замещать метод destroy, который вызывается после метода stop при явном уничтожении апплета. Метод destroy предназначен для освобождения ресурсов, которые использовал апплет. На практике этот метод замещается редко, потому что Java самостоятельно освобождает используемые ресурсы. Как только апплет уничтожается, все переменные в памяти теряют ссылки времени выполнения и становятся мусором, подчиняющимся встроенному сборщику мусора. Подпрограммы сборки мусора выполняются в фоновом режиме, когда система считает это необходимым, так что нет никакой реальной потребности в том, чтобы самостоятельно освобождать ресурсы. Замещение метода destroy может быть полезным в том случае, если, например, вам нужно удостовериться в том, что пользователь действительно хочет уничтожить апплет.

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

www.books-shop.com

Доступ к ресурсам

Одна из причин популярности World Wide Web - легкость, с которой авторы могут добавлять к своим Web-страницам изображения и звук, просто включая в код страницы указатели на местоположение графических и звуковых файлов, которые они хотят использовать. Использование языка Java дает еще более простой и намного более мощный способ.

HTML - язык описания документа; Java - добротный язык программирования. Ваши Javaапплеты могли бы использовать изображения как графические пиктограммы или спрайты в игре аркадного стиля. Следующий Java-апплет принимает из сети файл с изображением и звуком и отображает их.

Пример 5-3. Апплет для Web. import java.applet.*; import java.awt.*; import java.net.*;

public class WebApplet extends Applet { private Image myImage;

private AudioClip mySound; private URL ImageURL; private URL SoundURL; public void init() {

resize(250,250); try {

// привязываем URL к ресурсам

ImageURL = new URL("http://www.vmedia.com/vvc/onlcomp/java/chapter5/images/sample.gif");

SoundURL = new URL("http://www.vmedia.com/vvc/onlcomp/ java/chapter5/sounds/sample.au");

}

//следим за правильностью URL catch (MalformedURLException e) {}

//загружаем изображение

myImage = getImage(ImageURL); // загружаем звук

mySound = getAudioClip(SoundURL);

}

public void start() {

// запускаем проигрывание звука mySound.loop();

}

public void stop() {

// останавливаем проигрывание звука mySound.stop();

}

public void paint(Graphics g) { // выводим изображение

g.drawImage(myImage,0,0,this);

}

}

В этом фрагменте кода присутствуют ссылки на три класса, которые могут быть вам незнакомы: java.awt.Image, java.applet.AudioClip и java.net.URL. Эти классы подобно большинству классов, определенных в Java API, делают более или менее то, что подразумевают их имена.

Класс Image

Класс Image определяет простое двумерное графическое изображение. Класс Graphics (используемый методом paint) может выводить изображения с помощью метода drawImage, как показано в следующем примере:

Image myImage;

myImage = createImage(50, 50);

www.books-shop.com

g.drawImage(myImage, 0, 0, this);

Метод createImage определен для класса jawa.awt.Component, родителя класса Applet. Этот метод воспринимает два аргумента типа int и создает новое место для изображения с заданными размерами.

Метод drawImage принимает четыре параметра: непосредственно изображение, координаты расположения изображения в окне и класс ImageObserver. Мы подробно опишем этот класс в главе 9, "Графика и изображения", а сейчас просто подставьте ваш апплет непосредственно в качестве параметра ImageObserver при использовании drawImage.

СОВЕТ Если вам надо передать апплет как параметр, вы можете использовать ключевое слово this, о котором говорилось в главе 4, "Синтаксис и семантика".

Класс Applet использует метод getImage(URL) для получения изображения из сети. Этот метод выполнен с помощью интерфейса AppletContext (см. врезку "Интерфейс AppletContext" выше). Следовательно, Java-апплеты могут импортировать изображения любого графического формата, поддерживаемого Web-броузером. Наиболее часто используемые форматы - GIF и JPEG. Для загрузки изображениям обычно нужно некоторое время, но мы можем идти вперед и уже выводить изображения в нашем апплете; но фактически изображения появятся не сразу, а через некоторое время. Если вам нужен более полный контроль над изображениями, вы можете использовать класс MediaTracker, о котором мы будем говорить в главе 9.

Класс AudioClip

Класс java.applet.AudioClip - это представление высокого уровня для звуковых данных. В этом классе определены три метода: play, loop и stop. Класс апплета определяет метод getAudioClip, который по заданному URL возвращает звуковой файл. Подобно методу getImage, метод getAudioClip фактически выполняется контекстом апплета; так, апплет способен использовать любой звуковой формат, поддерживаемый броузером. К примеру, следующий фрагмент кода:

AudioClip mySound; mySound.play();

проигрывает звук, представляемый данным AudioClip. Класс Applet определяет метод play(URL), который, когда ему передан URL звукового файла, проигрывает этот файл. Если звуковой файл отсутствует или его формат не поддерживается, ничего не произойдет. Класс AudioClip, подобно Image, может использоваться, как только звук затребован, но ему может понадобиться некоторое время, чтобы фактически загрузить и проиграть звук. К сожалению, класс MediaTracker, с помощью которого можно загрузить изображения до того, как они потребуются, еще не поддерживает AudioClip.

Класс URL

URL, или Uniform Resource Locators ("унифицированная ссылка на ресурс"), - полный адрес объекта в World Wide Web (например, http://www.vmedia.com/index.htall - адрес Web-страницы узла Ventana Online). В языке программирования Java есть отдельный класс для обработки URL. Экземпляр класса представляет собой объект в Web. Класс URL будет описан полностью в главе 14, "Работа с сетью на уровне URL", но вы можете начинать использовать его уже теперь. Самый простой способ создавать объект URL состоит в использовании конструктора URL (String):

URLmyObject;

myQbject = new URL ("http://www.vmledia.com/index.html");

К сожалению, этот фрагмент кода не завершен. Если бы мы пробовали его откомпилировать, Java-компилятор пожаловался бы на то, что мы не сумели обработать исключительную ситуацию MalformedURLException. URL может быть очень сложным, однако легко создать объект URL со строкой, которая напоминает URL, но им не является. Если это случится, конструктор URL потерпит неудачу и сообщит апплету, что строка URL, которую он проанализировал, неправильна. Мы должны быть подготовлены к этому обстоятельству и перехватывать ошибку, что и делается в следующем фрагменте кода:

www.books-shop.com