Программирование на языке Java

         

ImageFilter и ImageFilterSource



ImageFilter и ImageFilterSource

Подклассы классов ImageFilter и ImageFilterSource используются совместно для создания новых изображений фильтрованием уже существующих. С двумя такими подклассами из пакета java.awt.image вы сейчас познакомитесь.



ImageObserver



ImageObserver

ImageObserver - это абстрактный интерфейс, используемый для получения сообщения о создании изображения, Метод imageUpdate из ImageObserver - это все, что вы должны реализовать в своем апплете для его использования. В то время, как вы получаете информацию о загрузке, вы можете показывать любую понравившуюся вам мультипликацию, индикатор степени завершения загрузки или любую другую заставку. Для использования ImageObserver в своем подклассе Applet вы должны добавить в него строку implement ImageObserver, как показано в этом фрагменте программы: public class MyApplet extends Applet implement ImageObserver {

Затем вам придется вставить в свой класс метод imageUpdate для интерфейса ImageObserver, как показано в следующем фрагменте : public boolean imageUpdate(Image img, int status, int x, int у int width, int height) { if((status & ALLBITS) != 1) { System.out.println("Still processing the image"); return true; } else { System.out.println("Done processing the image"); return false; } }

Метод imageUpdate вызывается с изображением Image, которое находится в процессе изменения, целым параметром status, отражающим состояние изменения, и с координатами прямоугольника (x, у, width, height), которые соответствуют различным величинам в зависимости от информационных флагов, перечисленных ниже. ImageUpdate должен возвращать false по окончании загрузки изображения и true - если изображение еще обрабатывается.

Целая переменная status поразрядно проверяется на наличие одного или нескольких флагов. Возможные флаги и информация, которую они несут, перечислены ниже:



WIDTH Ширина изображения доступна и может быть взята из аргумента width.
HEIGHT Высота изображения доступна и может быть взята из аргумента height.
PROPERTIES Свойства изображения теперь доступны. Вы можете получить их посредством art.properties.
SOMEBITS Доступны пиксели, необходимые для рисования масштабированного варианта изображения. Область, содержащая новые пиксели, задается параметрами x, у, width и height.
FRAMEBITS Еще один кадр ранее нарисованного изображения с несколькими кадрами, готов для перерисовки. Параметры x, у, width, height не содержат информации.
ALLBITS Обработка перерисовываемого изображения окончена, и оно может быть отрисовано в конечном виде. Значения аргументов x, у, width и height не содержат значимой информации.
ERROR При пересылке изображения возникла ошибка. Поступление дальнейшей информации стало невозможным и рисование прервано. Для удобства выставляется и флаг ABORT для индикации прерывания загрузки изображения.
ABORT Пересылка изображения была прервана до полного его получения. Поступление новой информации стало невозможным без дополнительных действий по повторному запуску операций по получению изображения. Если флаг ERROR не был выставлен, то приход любых данных изображения снова запустит процесс его получения.

Теперь давайте рассмотрим программный пример, который использует ImageObserver для показа количества обработанных строк изображения и выводит эту информацию (переменная progress) на консоль: /* <title>ObservedImageLoad</title> * <applet code="ObservedImageLoad" width=290 height=140> * <param name="img" value="mupk.gif"> * </applet> */ import java.applet.*; import java.awt.*; import java.awt.image.*; public class ObservedImageLoad extends Applet implements Runnable, ImageObserver { Image art; Dimension d; int progress; Thread motor; boolean loaded; public void init() { art = getImage(getDocumentBase(), getParameter("img")); loaded = false; progress = 0; } public void paint(Graphics g) { d = this.getSize(); loaded = g.drawImage(art, 0, 0, this); } public boolean imageUpdate(Image img, int info, int x, int y, int width, int height) { if((info & ALLBITS) != 1) { if(progress<d.height) { progress = progress+height; } System.out.println(progress+"/"+d.height); return true; } else { return false; }} public void start() { motor = new Thread(this); motor. start(); } public void stop() { motor.stop(); } public void run() { motor.setPriority(Thread.MIN_PRIORITY); while(!loaded) { // update progress indicator (5 fps) repaint(); try { motor.sleep(200); } catch(InterruptedException e) {} } } }

Метод imageUpdate обрабатывает статус загрузки изображения. Информация о статусе передается через переменную info, с которой сравнивается статическая переменная ALLBITS. Если еще не получено все изображение, то мы добавляем величину heihgt к общему числу обработанных строк изображения. Для проверки этой концепции мы выводим количество обработанных строк изображения на консоль. Метод run перерисовывает апплет пять раз в секунду (каждые 200 миллисекунд) до тех пор, пока изображение art не загрузится. То, как долго монитор статуса загрузки будет работать, зависит от скорости передачи данных изображения по сети - ObservedImageLoad.html.



ImageProducer



ImageProducer

ImageProducer - это абстрактный интерфейс для объектов, которые готовят данные для Image. Объект, который реализует интерфейс ImageProducer, должен предоставлять массивы целых или байтовых переменных, представляющих собой данные изображений. Давайте познакомимся с очень полезным классом MemoryImageSource, реализующий ImageProducer. Мы создадим новый объект Image из данных, которые сгенерировал ImageProducer.



IndexOf и lastIndexOf



indexOf и lastIndexOf

В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода - indexOf и lastIndexOf. Каждый из этих методов возвращает индекс того символа, который вы хотели найти, либо индекс начала ис-комой подстроки. В любом случае, если поиск оказался неудачным ме-тоды возвращают значение -1. В очередном примере показано, как пользоваться различными вариантами этих методов поиска. class indexOfDemo { public static void main(String args[]) { String s = "Now is the time for all good men " + "to come to the aid of their country " + "and pay their due taxes."; System.out.println(s); System.out.println("indexOf(t) = " + s.indexOf('f')); System.out.println("lastlndexOf(t) = " + s.lastlndexOf('f')); System.out.println("indexOf(the) = " + s.indexOf("the")); System.out.println("lastlndexOf(the) = " + s.lastlndexOf("the")); System.out.println("indexOf(t, 10) = " + s.indexOf('f' , 10)); System.out.println("lastlndexOf(t, 50) = " + s.lastlndexOf('f' , 50)); System.out.println("indexOf(the, 10) = " + s.indexOf("the", 10)); System.out.println("lastlndexOf(the, 50) = " + s.lastlndexOf("the", 50)); } }

Ниже приведен результат работы этой программы. Обратите внимание на то, что индексы в строках начинаются с нуля. С:> java indexOfDemo Now is the time for all good men to come to the aid of their country and pay their due taxes. indexOf(t) = 7 lastlndexOf(t) = 87 indexOf(the) = 7 lastlndexOf(the) = 77 index0f(t, 10) = 11 lastlndex0f(t, 50) = 44 index0f(the, 10) = 44 lastlndex0f(the, 50) = 44



InetAddress



InetAddress

Java поддерживает адреса абонентов, принятые в Internet, с помощью класса InetAddress. Для адресации в Internet используются служебные функции, работающие с обычными, легко запоминающимися символическими именами, эти функции преобразуют символические имена в 32-битные адреса.



Init



init

Метод init вызывается первым. В нем вы должны инициализировать свои переменные.



Insert



insert

Метод insert идентичен методу append в том смысле, что для каждого возможного типа данных существует своя совмещенная версия этого ме-тода. Правда, в отличие от append, он не добавляет символы, возвра-щаемые методом String.valueOf, в конец объекта StringBuffer, а встав-ляет их в определенное место в буфере, задаваемое первым его параметром. В очередном нашем примере строка "there" вставляется между "hello" и "world!". class insertDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("hello world !"); sb.insert(6,"there "); System.out.println(sb); } }

При запуске эта программа выводит следующую строку: С:\> java insertDemo hello there world!

Без строк не обойдешься

Почти любой аспект программирования в Java на каком либо этапе подразумевает использование классов String и StringBuffer. Они понадо-бятся и при отладке, и при работе с текстом, и при указании имен фай-лов и адресов URL в качестве параметров методам. Каждый второй байт большинства строк в Java - нулевой (Unicode пока используется редко). То, что строки в Java требуют вдвое больше памяти, чем обыч-ные ASCII, не очень пугает, пока вам для эффективной работы с текстом в редакторах и других подобных приложениях не придется напрямую работать с огромным массивом типа char.



Insets



Insets

Класс Insets используется для того, чтобы вставлять в объект Panel границы, напоминающие горизонтальные и вертикальные промежутки между объектами, которые делает диспетчер размещения. Для того, чтобы добиться вставки границ в объект Panel, нужно заместить метод Insets реализацией, возвращающей новый объект Insets с четырьмя целыми значениями, соответствующими ширине верхнего, нижнего, левого и правого краев. public Insets insets() { return new Insets(10, 10, 10, 10); }



Int



int

Тип int служит для представления 32-битных целых чисел со знаком. Диапазон допустимых для этого типа значений - от -2147483648 до 2147483647. Чаще всего этот тип данных используется для хранения обычных целых чисел со значениями, достигающими двух миллиардов. Этот тип прекрасно подходит для использования при обработке массивов и для счетчиков. В ближайшие годы этот тип будет прекрасно соответствовать машинным словам не только 32-битовых процессоров, но и 64-битовых с поддержкой быстрой конвейеризации для выполнения 32-битного кода в режиме совместимости. Всякий раз, когда в одном выражении фигурируют переменные типов byte, short, int и целые литералы, тип всего выражения перед завершением вычислений приводится к int. int i; int j = 0x55aa0000;



Integer и Long



Integer и Long

Класс Integer - класс-оболочка для чисел типов int, short и byte, a класс Long - соответственно для типа long. Помимо наследуемых методов своего суперкласса Number, классы Integer и Long содержат методы для разбора текстового представления чисел, и наоборот, для представления чисел в виде текстовых строк. Различные варианты этих методов позволяют указывать основание (систему счисления), используемую при преобразовании. Обычно используются двоичная, восьмеричная, десятичная и шестнадцатиричная системы счисления. parseInt(String) преобразует текстовое представление целого числа, содержащееся в переменной String, в значение типа int. Если строка не содержит представления целого числа, записанного в допустимом формате, вы получите исключение NumberFormatException. parseInt(String, radix) выполняет ту же работу, что и предыдущий метод, но в отличие от него с помощью второго параметра вы можете указывать основание, отличное от 10. toString(int) преобразует переданное в качестве параметра целое число в текстовое представление в десятичной системе. toString(int, radix) преобразует переданное в качестве первого параметра целое число в текстовое представление в задаваемой вторым параметром системе счисления.



Интерактивность



Интерактивность

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



Интерфейс Enumeration



Интерфейс Enumeration

Enumeration - простой интерфейс, позволяющий вам обрабатывать элементы любой коллекции объектов. В нем задается два метода. Первый из них - метод hasMoreElements, возвращающий значение типа boolean. Он возвращает значение true, если в перечислении еще остались элементы, и false, если у данного элемента нет следующего. Второй метод - nextElement - возвращает обобщенную ссылку на объект класса Object, которую, прежде чем использовать, нужно преобразовать к реальному типу содержащихся в коллекции объектов.

Ниже приведен пример, в котором используется класс Enum, реализующий перечисление объектов класса Integer, и класс EnumerateDemo, создающий объект типа Enum, выводящий все значения перечисления. Обратите внимание на то, что в объекте Enum не содержится реальных данных, он просто возвращает последовательность создаваемых им объектов Integer. import java.util.Enumeration; class Enum implements Enumeration { private int count = 0; private boolean more = true; public boolean hasMoreElements() { return more; } public Object nextElement() { count++; if (count > 4) more = false; return new Integer(count); } } class EnumerateDemo { public static void main(String args[]) { Enumeration enum = new Enum(); while (enum.hasMoreElements()) { System.out.println(enum.nextElement()); } } }

Вот результат работы этой программы: С:\> java EnumerateDemo 1 2 3 4 5 Vector

Vector - это способный увеличивать число своих элементов массив ссылок на объекты. Внутри себя Vector реализует стратегию динамического расширения, позволяющую минимизировать неиспользуемую память и количество операций по выделению памяти. Объекты можно либо записывать в конец объекта Vector с помощью метода addElement, либо вставлять в указанную индексом позицию методом insertElementAt. Вы можете также записать в Vector массив объектов, для этого нужно воспользоваться методом copyInto. После того, как в Vector записана коллекция объектов, можно найти в ней индивидуальные элементы с помощью методов Contains, indexOf и lastIndexOf. Кроме того методы еlеmentAt, firstElement и lastElement позволяют извлекать объекты из нужного положения в объекте Vector.



Интерфейсы



Интерфейсы

Интерфейсы Java созданы для поддержки динамического выбора (resolution) методов во время выполнения программы. Интерфейсы похожи на классы, но в отличие от последних у интерфейсов нет переменных представителей, а в объявлениях методов отсутствует реализация. Класс может иметь любое количество интерфейсов. Все, что нужно сделать - это реализовать в классе полный набор методов всех интерфейсов. Сигнатуры таких методов класса должны точно совпадать с сигнатурами методов реализуемого в этом классе интерфейса. Интерфейсы обладают своей собственной иерархией, не пересекающейся с классовой иерархией наследования. Это дает возможность реализовать один и тот же интерфейс в различных классах, никак не связанных по линии иерархии классового наследования. Именно в этом и проявляется главная сила интерфейсов. Интерфейсы являются аналогом механизма множественного наследования в C++, но использовать их намного легче.



Интерпретация плюс высокая производительность



Интерпретация плюс высокая производительность

Необычайная способность Java исполнять свой код на любой из поддерживаемых платформ достигается тем, что ее программы транслируются в некое промежуточное представление, называемое байт-кодом (bytecode). Байт-код, в свою очередь, может интерпретироваться в любой системе, в которой есть среда времени выполнения Java. Большинство ранних систем, в которых пытались обеспечить независимость от платформы, обладало огромным недостатком — потерей производительности (Basic, Perl). Несмотря на то, что в Java используется интерпретатор, байт-код легко переводится непосредственно в “родные” машинные коды (Just In Time compilers) “на лету”. При этом достигается очень высокая производительность (Symantec JIT встроен в Netscape Navigator).

Простота изучения

Язык Java, хотя и более сложный чем языки командных интерпретаторов, все же неизмеримо проще для изучения, чем другие другие языки программирования, например C++. Черты языка станут казаться вам естественным путем для решения тех или иных задач и будут способствовать отработке хорошего стиля программирования. Поскольку объектная модель в Java одновременно проста и выразительна, вы скоро освоитесь с объектно-ориентированным стилем создания программ.



IsBold, isItalic, isPlain



isBold, isItalic, isPlain

Эти методы возвращают true в том случае, если стиль шрифта - полужирный (bold), курсив (italic) или обычный (plain), соответственно.



Исключения



Исключения

Последний способ вызвать передачу управления при выполнении кода - использование встроенного в Java механизма обработки исключительных ситуаций. Для этой цели в языке предусмотрены операторы try, catch, throw и finally. Глава 10 целиком посвящена изучению механизма обработки исключительных ситуаций.



Использование пакетов



Использование пакетов

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



Использование шрифтов



Использование шрифтов

Конструктор класса Font создает новый шрифт с указанным именем, стилем и размером в пунктах: Font StrongFont = new Font("Helvetica", Font.BOLD|Font.ITALIC, 24);

В настоящее время доступны следующие имена шрифтов: Dialog, Helvetica, TimesRoman, Courier и Symbol. Для указания стиля шрифта внутри данного семейства предусмотрены три статические переменные. - Font.PLAIN, Font.BOLD и Font.ITALIC, что соответствует обычному стилю, курсиву и полужирному.

Теперь давайте посмотрим на несколько дополнительных методов.



История создания



История создания

Язык Java зародился как часть проекта создания передового программного обеспечения (ПО) для различных бытовых приборов. Реализация проекта была начата на языке С++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента - языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами.

Рождению языка Java предшествовала довольно интересная история. В 1990 году разработчик ПО компании Sun Microsystems Патрик Нотон (Patrick Naughton) понял, что ему надоело поддерживать сотни различных интерфейсов программ, используемых в компании, и сообщил исполнительному директору Sun Microsystems и своему другу Скотту МакНили (Scott McNealy) о своем намерении перейти работать в компанию NeXT. МакНили, в свою очередь, попросил Нотона составить список причин своего недовольства и выдвинуть такое решение проблем, как если бы он был Богом и мог исполнить все, что угодно.

Нотон, хотя и не рассчитывал на то, что кто-то обратит внимание на его письмо, все же изложил свои претензии, беспощадно раскритиковав недостатки Sun Microsystems, в частности, разрабатываемую в тот момент архитектуру ПО NeWS. К удивлению Нотона, его письмо возымело успех: оно было разослано всем ведущим инженерам Sun Microsystems, которые не замедлили откликнуться и высказать горячую поддержку своему коллеге и одобрение его взглядов на ситуацию в Sun Microsystems. Обращение вызвало одобрение и у высшего руководства компании, а именно, у Билла Джоя (Bill Joy), основателя Sun Microsystems, и Джеймса Гослинга (James Gosling), начальника Нотона.

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

Вскоре компания Sun Microsystems преобразовала команду Green в компанию First Person. Новая компания обладала интереснейшей концепцией, но не могла найти ей подходящего применения. После ряда неудач неожиданно ситуация для компании резко изменилась: был анонсирован броузер Mosaic - так родился World Wide Web, с которого началось бурное развитие Internet. Нотон предложил использовать Oak в создании Internet-приложений. Так Oak стал самостоятельным продуктом, вскоре был написан Oak-компилятор и Oak-браузер "WebRunner". В 1995 году компания Sun Microsystems приняла решение объявить о новом продукте, переименовав его в Java (единственное разумное объяснение названию - любовь программистов к кофе). Когда Java оказалась в руках Internet, стало необходимым запускать Java-аплеты - небольшие программы, загружаемые через Internet. WebRunner был переименован в HotJava и компания Netscape встала на поддержку Java-продуктов.



Извлечение символов



Извлечение символов

Для того, чтобы извлечь одиночный символ из строки, вы можете со-слаться непосредственно на индекс символа в строке с помощью метода charAt. Если вы хотите в один прием извлечь несколько символов, можете воспользоваться методом getChars. В приведенном ниже фрагменте показано, как следует извлекать массив символов из объекта типа String. class getCharsDemo { public static void main(String args[]) { String s = "This is a demo of the getChars method."; int start = 10; int end = 14; char buf[] = new char[end - start]; s.getChars(start, end, buf, 0); System.out.println(buf); } }

Обратите внимание - метод getChars не включает в выходной буфер символ с индексом end. Это хорошо видно из вывода нашего примера - выводимая строка состоит из 4 символов. С:\> java getCharsDemo demo

Для удобства работы в String есть еще одна функция - toCharArray, которая возвращает в выходном массиве типа char всю строку. Альтернативная форма того же самого механизма позволяет записать содержимое строки в массив типа byte, при этом значения старших бай-тов в 16-битных символах отбрасываются. Соответствующий метод на-зывается getBytes, и его параметры имеют тот же смысл, что и пара-метры getChars, но с единственной разницей - в качестве третьего параметра надо использовать массив типа byte.



Java 1.1 : пакет за пакетом



Java 1.1 : пакет за пакетом

Пакеты и классы в библиотеке классов Java взаимосвязаны и взаимозависимы. Многие из новых особенностей Java 1.1 базируются на классах, принадлежащих к нескольким различным пакетам Java API. Ниже описывается каждый из 23 пакетов, образующих ядро Java 1.1 API. Здесь представлены новые пакеты, а также рассмотрены изменения, внесенные в имеющиеся пакеты.



Java.applet



Java.applet

Кроме возможности создавать JAR-файлы и апплеты с цифровой подписью и вводить новые атрибуты в тег <applet>, в пакет java.applet никаких других существенных изменений внесено не было.



Java.awt



java.awt

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



Java.awt.datatransfer



java.awt.datatransfer

Классы и интерфейсы данного пакета образуют фундамент для обмена информацией между приложениями (а также внутри приложения). В этом пакете также содержатся классы, поддерживающие модель передачи информации путем операций копирования и вставки через буфер обмена (clipboard). Можно предполагать, что в будущем пакет будет расширен таким образом, чтобы обеспечить поддержку механизма обмена информацией посредством технологии drag-and-drop. Один из основополагающих механизмов обмена информацией, поддерживаемых данным пакетом, базируется на использовании API сериализации объектов (Object Serialization API) пакета java.io.



Java.awt.event



java.awt.event

В данном пакете определены классы и интерфейсы новой модели обработки событий пакета AWT. Классы и интерфейсы этого пакета можно разделить на три категории: Классы событий — классы, которые действительно описывают события. Слушатели событий (listeners) — интерфейсы, определяющие методы, которые должны быть реализованы объектами, заинтересованными в получении уведомлений о событиях определенного типа. Адаптеры событий (adaptors) — тривиальные безоператорные реализации интерфейсов слушателей событий, которые хорошо приспособлены для создания подклассов.

Все события и слушатели событий, определенные в этом пакете, представляют собой расширения класса EventObject или интерфейса Event-Listener, определенные в пакете java.util.



Java.awt.image



java.awt.image

В этом пакете содержатся два новых класса фильтров изображений, в которых используется улучшенное масштабирование изображений. Также внесены изменения в классы MemoryImageSource и PixelGrabber.



Java.awt.peer



java.awt.peer

Изменения, внесенные в этот пакет, в основном отражают изменения в java.awt. Например, к ним относятся новые интерфейсы, которые описывают зависящие от платформы контекстные меню и полосы прокрутки.



Java Bean-объект



Java Bean-объект

Механизм построения модульных программных компонентов, предназначенных для многократного использования.



Java.beans



java.beans

В этом пакете содержится широко разрекламированный JavaBeans API, предназначенный для создания и использования встраиваемых программных компонентов многократного использования. Классы и интерфейсы данного пакета можно применять на трех различных уровнях: Для создания средств построения приложений, которые программист (и даже не программист) может использовать при создании приложений из отдельных Bean-объектов. Для разработки Bean-объектов, которые можно применять в упомянутых выше средствах построения приложений. Для разработки приложений (без использования упомянутых выше средств построения), в которых применяются Bean-объекты.

Большинство классов и интерфейсов данного пакета предназначено для разработчиков приложений или более сложных Bean-объектов. Программистам, которые только используют Bean-объекты или разрабатывают простые Bean-объекты, не обязательно изучать большинство особенностей данного пакета. Работа средств построения приложений, применяющих Bean-объекты, базируется на Reflection API, определенном в пакете java.lang.reflect, а во многих Bean-объектах используются преимущества API сериализации объектов (Object Serialization API), определенного в пакете java.io. В JavaBeans API применяется та же модель обработки событий, что и в Java 1.1 AWT, и классы и интерфейсы данного пакета, обеспечивающие обработку событий, являются расширениями соответствующего класса и интерфейса, определенных в пакете java.util.



Java Database Connectivity (JDBC)



Java Database Connectivity (JDBC)

Новый пакет, позволяющий Java-программам посылать SQL-запросы серверам баз данных. В его состав входит "мост", который обеспечивает взаимодействие с существующими серверами баз данных ODBC.



Java.io



java.io

Пакет java.io — самый большой пакет ядра Java на сегодняшний день. Это случилось потому, что в Java 1.1 добавлены следующие компоненты: Полный набор новых классов потока символов в дополнение к большинству существующих классов ввода-вывода через поток байтов. Эти новые потоки чтения-записи обеспечивают высокую эффективность и многоязыковую поддержку ввода-вывода текстовой информации. Новые классы и интерфейсы для поддержки сериализации объектов. Ряд новых типов семейства IOException.



Java.lang



java.lang

В этом пакете содержится ряд новых семейств типа Exception и Error, а также новые классы Byte, short и Void, с добавлением которых всем простым типам данных Java (включая тип void) соответствуют определенные типы объектов. Это обстоятельство играет большую роль для пакета j ava. lang. reflect, где определяется новый Reflection API. К тому же, существенные изменения, направленные на поддержку работы Reflection API, внесены и в класс Class. В классах Class HClassLoader содержатся методы, обеспечивающие нахождение ресурсов, связанных с данным классом, таких как изображения, аудиофайлы, файлы свойств и т.д. Ресурсы играют важную роль в обеспечении многоязыковой поддержки в Java 1.1.



Java.lang.reflect



java.lang.reflect

Этот новый пакет позволяет программе на Java проверять структуру классов Java и отражать ее на собственную структуру. В java.lang.reflect содержатся классы, которые описывают переменные, методы и конструкторы классов и позволяют программе получить исчерпывающую информацию о любом объекте, массиве, методе, конструкторе или переменной. Пакет java.Beans в огромной степени базируется именно на этом пакете.



Java.math



Java.math

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



Java.net



java.net

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



Java.rmi



java.rmi

В этом пакете определены основополагающие классы и интерфейсы, которые используются для удаленного вызова методов. Большинство классов данного пакета представляют собой типы исключений. Подпакеты пакета java.rmi обеспечивают дополнительные, более специфичные функции. В тех случаях, когда удаленным методам в качестве аргументов необходимо передавать объекты, удаленный вызов метода базируется на сериализации объектов, обеспечиваемой пакетом java.io.



Java.rmi.dgc



java.rmi.dgc

В этом небольшом пакете определены классы и интерфейсы, которые необходимы для реализации распределенного сбора мусора (DGC — Distributed Garbage Collection).



Java.rmi.registry



java.rmi.registry

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



Java.rmi.server



java.rmi.server

Этот пакет является самым большим среди пакетов удаленного вызова методов и представляет собой сердцевину RMI. В нем определены классы и интерфейсы, позволяющие Java-программе создавать объекты, которые могут использоваться удаленно другими Java-программами.



Java.security



java.security

В этом пакете содержатся классы и интерфейсы, являющиеся фундаментальными абстракциями элементов криптографии: открытых и закрытых ключей, сертификатов, подтверждений о приеме сообщений и цифровых подписей. В данном пакете отсутствуют реализации таких абстракций. По своему замыслу Java Security API является независящим от реализации. В Java 1.1 отсутствуют реализации по умолчанию, но наряду с этим пакетом можно использовать реализации, осуществляемые продавцом конкретного программного продукта. Базовая реализация механизма безопасности основывается на использовании класса Biglnteger, который определен в пакете java .math.



Java.security.acl



java.security.acl

В этом пакете определены интерфейсы высокого уровня и некоторые исключения, предназначенные для работы со списками управления доступом (ACL — access control list).



Java.security.interfaces



java.security.interfaces

В этом пакете определено несколько интерфейсов, которые необходимы для работы схемы безопасности Java Security API, независящей от реализации.



Java.sql



java.sql

В этом пакете содержится Java Database Connectivity (JDBC) API. Находящиеся здесь классы и интерфейсы позволяют программам на Java посылать SQL-запросы базам данных и получать на них ответы.



Java.text



java.text

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



Java.util



java.util

Как следует из названия данного пакета, в java.util содержатся вспомогательные классы. В этот пакет в Java 1.1 добавлены новые классы для поддержки моделей обработки событий пакетов AWT и Java Beans, для определения местности (locale) и групп ресурсов (resource bundles), используемых для обеспечения многоязыковой поддержки, а также классы для работы с датой, временем и временными поясами.



Java.util.zip



java.util.zip

В этом пакете реализованы классы для расчета контрольных сумм потоков данных, а также для сжатия и архивирования потоков данных с использованием библиотеки сжатия ZLIB и форматов файлов ZIP и GZIP.



Явные приоритеты



Явные приоритеты

Поскольку высший приоритет имеют круглые скобки, вы всегда можете добавить в выражение несколько пар скобок, если у вас есть сомнения по поводу порядка вычислений или вам просто хочется сделать свои код более читабельным. а >> b + 3

Какому из двух выражений, а >> (b + 3) или (а >> b) + 3, соответствует первая строка? Поскольку у оператора сложения более высокий приоритет, чем у оператора сдвига, правильный ответ - а>> (b + а). Так что если вам требуется выполнить операцию (а>>b)+ 3 без скобок не обойтись.



Элементы и связанные с ними события



Элементы и связанные с ними события

В таблице 5 для каждого элемента пакета AWT перечислены типы событий, которые он может порождать. В первом столбце таблицы указан тип элемента, а во втором - тип соответствующего ему события. Тип события представляет собой константу, которая записывается в переменную id объекта класса Event.

В столбцах с третьего по седьмой указано, устанавливаются ли значения переменных -when (время события), х (координата х курсора мыши), у (координата у курсора мыши), key (нажатая кнопка) и modifiers (специальные клавиши, которые нажаты при этом) для данного события. Если в столбце стоит точка, значит, событие устанавливает значение соответствующей переменной. В восьмом столбце объяснено, что порождает данное событие и приведено значение, которое записывается в переменной arg объекта класса Event.

События, перечисленные для элементов класса Component, применимы ко всем подклассам класса java.awt. Component, а события, приведенные для элементов класса window, относятся как к подклассам класса window, так и к классам Dialog и Frame.



Классическое заключение



Классическое заключение

В этой главе вы научились создавать классы, конструкторы и методы. Вы осознали разницу между совмещением (overloading) и замещением (overriding) методов. Специальные переменные this и super помогут вам сослаться на текущий объект и на его суперкласс. В ходе эволюции языка Java стало ясно, что в язык нужно ввести еще несколько организационных механизмов - возможности более динамичного назначения методов и возможности более тонкого управления пространством имен класса и уровнями доступа к переменным и методам объектов. Оба этих механизма - интерфейсы и пакеты, описаны в следующей главе.



Клинч (deadlock)



Клинч (deadlock)

Клинч - редкая, но очень трудноуловимая ошибка, при которой между двумя легковесными процессами существует кольцевая зависимость от пары синхронизированных объектов. Например, если один подпроцесс получает управление объектом X, а другой - объектом Y, после чего Х пытается вызвать любой синхронизированный метод Y, этот вызов, естественно блокируется. Если при этом и Y попытается вызвать синхронизированный метод X, то программа с такой структурой подпроцессов окажется заблокированной навсегда. В самом деле, ведь для того, чтобы один из подпроцессов захватил нужный ему объект, ему нужно снять свою блокировку, чтобы второй подпроцесс мог завершить работу.

Сводка функций программного интерфейса легковесных процессов

Ниже приведена сводка всех методов класса Thread, обсуждавшихся в этой главе.