- •Особенности языка Java
- •История Java
- •Характерные особенности Java
- •Разработка и выполнение Java приложения:
- •Понятие среды выполнения Java
- •Переносимость языка Java
- •Высокая производительность языка Java
- •Типы Java-приложений
- •Автономное (самостоятельное) приложение – application
- •Апплет – applet
- •Комбинированное приложение
- •Сервлет – servlet
- •Мидлет – midlet
- •Различия между автономными приложениями и апплетами
- •Автономное приложение
- •Апплет
- •Этапы жизненного цикла апплета
- •Этапы жизненного цикла в соответствии со стандартом Sun:
- •Этап инициализации
- •Этап запуска
- •Этап останова
- •Этап уничтожения
- •Этап рисования (перерисовки) окна апплета
- •Отличия Java от C++
- •Конструкторы классов
- •«Сборщик мусора»
- •Типы данных в Java
- •Простые типы
- •Ссылочные (объектные) типы
- •Строки в Java
- •Массивы в Java
- •Классы в Java
- •Особенности реализации
- •Пакеты
- •Управление доступом к элементам класса
- •Поля класса
- •Методы
- •Перегрузка и переопределение методов
- •Ключевые слова THIS и SUPER
- •Интерфейсы в Java
- •Понятие Java API
- •Пакеты ядра Java API (в JDK 1.0):
- •Развитие ядра Java API (в новой версии JDK и в Java 2)
- •Основные понятия AWT
- •Компоненты
- •Контейнеры
- •Компоновки. Менеджеры компоновки
- •События
- •События. Обработка событий
- •Иерархия классов-событий
- •Семантические события и их источники-компоненты AWT
- •Модель делегирования событий
- •Методы, объявленные в интерфейсах для семантических событий
- •Способы реализации блока прослушивания событий от AWT-компонента
- •Понятие класса-адаптера
- •Комбинированное приложение Java. Обработка события WindowEvent
- •Исключения в Java и их обработка
- •Иерархия классов исключений
- •Различия между исключениями Exception и ошибками Error
- •Организация обработки исключений в программе
- •Используемые операторы:
- •Как правильно организовывать обработку исключений
- •Понятия процесса и потока
- •Конструкторы класса Thread
- •Наиболее важные методы класса Thread
- •Способы создания потоков
- •Синхронизация потоков
- •Когда следует использовать синхронизацию потоков?
- •Механизм блокировки объекта
- •Способы использования ключевого слова synchronized
- •Синхронизированные методы
- •Оператор synchronized
- •Преимущества оператора synchronized:
- •Взаимодействие потоков: использование методов wait(), notify(), notifyAll()
- •Стандартные образцы кода использования методов
- •Поток-диспетчер событий AWT
- •Потоки и исключения
- •О группах потоков
- •Технология компонентного программирования JavaBeans
- •Понятие технологии компонентного программирования
- •Этап компиляции
- •Этап разработки
- •Этап создания приложения
- •Этап выполнения
- •Понятие компонентной модели
- •Основные требования к классам Bean-компонентов
- •Соглашения об именах
- •Соглашения об именах для свойств
- •Соглашения об именах для событий
- •Соглашения об именах для методов
- •Использование событий для управления свойствами
- •Связанные свойства
- •Преобразование обычного свойства в связанное
- •Ограниченные свойства
- •Преобразование обычного свойства в ограниченное
- •Ввод-вывод в Java: основные понятия
- •Основные группы классов и интерфейсов пакета java.io
- •Фильтрованные потоки
- •Буферизированные потоки
- •Принципы работы Buffered-потоков
- •Входные потоки
- •Выходные потоки
- •Канальные потоки
- •Синхронизация потоков данных
- •Понятие отражения (рефлексии)
- •Класс java.lang.Class
- •Классы пакета java.lang.reflect
- •Понятие интроспекции
- •Понятие сериализации
- •Обеспечение сериализуемости Bean
- •Выполнение базовой сериализации
- •Пример с сериализацией (см. SerializationDemo.java)
- •Настройка сериализации
- •Методы readObject и writeObject
- •Интерфейс Externalizable
- •Создание экземпляров сериализованных Bean
- •Приложение
- •// Файл HelloApplet.java
- •// Файл MyApplet.java
- •// Файл StringDemo.java
- •// Файл ConstrDemo.java
- •// Фрагменты файла AnimBallsPlus.java
Скачано с сайта http://ivc.clan.su
(вызов метода fireVetoableChange()) до реального изменения его значения и выполнять эти действия в блоке try.
Метод vetoableChange(PropertyChangeEvent pce) блока прослушивания может выбросить исключение PropertyVetoException в случае, если предложенное изменение следует отменить.
Блок catch set-метода перехватывает исключение и обрабатывает его. Если исключения не было, после вызова метода fireVetoableChange() выполняется оператор изменения свойства.
Пример:
private VetoableChangeSupport vcs = new VetoableChangeSupport (this); private int x;
public void addVetoableChangeListener (VetoableChangeListener vcl)
{
vcs.addVetoableChangeListener (vcl);
}
public void removeVetoableChangeListener (VetoableChangeListener vcl)
{
vcs.removeVetoableChangeListener (vcl);
}
public setX(int X)
{
try
{
vcs.fireVetoableChange ("x", new Integer(x), new Integer(X)); x = X;
}catch (PropertyVetoException e) {
//изменение было запрещено
}
}
...
public void vetoableChange (PropertyChangeEvent pee) throws PropertyVetoException
{
//проверяет, имеет ли свойство имя X
if ( ! (pce.getPropertyName().eguals("X"))) return;
try
{
Integer X = (Integer) pce.getNewValue(); int x = X.intValue();
if (x< 0 j i x > 50)
throw new PropertyVetoException("Значение свойства "Х" должно быть в диапазоне от 0 до 50", рcе);
}catch (ClassCastExeption e) {
//измененное свойство не имело тип Integer
Ввод-вывод в Java: основные понятия
1.Система ввода-вывода Java поддерживается пакетом java.io — библиотекой ядра API.
2.Базовым понятием ввода-вывода в Java является понятие потока данных stream (не путать с
потоком команд thread!).
40
Скачано с сайта http://ivc.clan.su
3. Поток данных — это абстрактное представление упорядоченной последовательности данных, которой соответствует либо источник, либо приёмник данных.
Библиотечные классы потоков позволяют не вникать в особенности низкоуровневой организации операционных систем. Потоки скрывают детали процессов, которые происходят в реальных устройствах ввода-вывода и одинаково работают с различными устройствами (консоль, файл на диске, сетевое соединение). Поток связывается с физическим устройством с помощью Java I/O System (системой ввода-вывода Java).
4.Две разновидности потоков данных:
байтовые потоки;
символьные потоки.
Символьные потоки используются в операциях текстового ввода-вывода. Под символьными потоками понимается последовательности 16-битовых Unicode-символов.
Байтовые потоки используются в операциях бинарного ввода-вывода, т.е. в операциях с информацией, представленной
вдвоичном виде.
5.Приняты следующие наименования потоков, отражающие принадлежность потоков к той или иной разновидности и направление передачи данных.
Байтовые потоки: |
– |
потоки ввода (input streams); |
|
– |
потоки вывода (output streams). |
Символьные потоки: |
– |
потоки чтения (readers); |
|
– |
потоки записи (writers). |
Входные потоки — это потоки ввода и потоки чтения. Выходные потоки — это потоки вывода и потоки записи.
Почти для каждого потока ввода существует поток вывода. Для большинства потоков ввода и вывода определены функционально сходные потоки чтения и записи (см. иерархии типов потоков на рис.).
Замечания:
1.Классы символьных потоков появились в JDK 1.1. Кроме того, в JDK 1.1 были исключены некоторые классы и методы байтовых потоков и добавлены новые. В JDK 1.2 (Java 2) в API ввода-вывода уже не появилось ничего принципиально нового.
2.Основной причиной появления иерархии классов Reader и Writer стала интернационализация, т.е. необходимость использования национальных алфавитов на основе Unicode-символов.
3.Классы Reader и Writer не заменяют классы байтовых потоков InputStream и OutputStream. Классы байтовых потоков представляют полезные возможности для реализации байт-ориентированного ввода-вывода. Классы символьных потоков обеспечивают удобные и эффективные средства для Unicode-ориентированного ввода-вывода.
41
Скачано с сайта http://ivc.clan.su
Рис. 1. Дерево иерархии типов байтовых потоков, определенных в пакете java.io
Рис. 2. Дерево иерархии типов символьных потоков, определенных в пакете java.io
42
Скачано с сайта http://ivc.clan.su
Основные группы классов и интерфейсов пакета java.io
1. Классы общего назначения, служащие для построения различных типов байтовых и символьных потоков: InputStream, OutputStream, Reader, Writer.
Наиболее важные методы: read(), write().
2. Классы, определяющие разновидности как байтовых, так и символьных потоков.
Например:
фильтрованные потоки (Filter)
Классы Filter представляют потоки, позволяющие применять к данным, вводимым или выводимым с помощью другого потока, операции фильтрации (некоторой обработки). Фильтрованные потоки могут объединяться в цепочки, образуя сложные единые фильтры.
буферизированные потоки (Buffered).
Класс Buffered представляет потоки, которые позволяют избежать непосредственного обращения к файлам при выполнении каждой операции чтения или записи read или write.
канальные потоки (Piped).
Классы Piped позволяют связывать входные и выходные потоки и получать канальные потоки. Канальные потоки используются в виде пар ввода-вывода и чтения-записи. Данные, переданные в выходной поток, служат источником для входного. Каналы реализуют механизм обмена данными между потоками команд (потоками типа thread): один поток осуществляет вывод данных в канал, другой — ввод из канала.
3.Специализированные потоковые классы и интерфейсы для вывода значений простых типов и строк: DatalnputStream и DataOutputStream.
4.Классы и интерфейсы для платформно-независимой обработки файловых данных: потоковые классы FilelnputStream, FileOutputStream, FileReader, FileWriter и другие классы.
5.Классы и интерфейсы, поддерживающие механизм сериализации, который позволяет преобразовывать объект в байтовый поток и при необходимости восстанавливать из данных потока:
Serializable, Externalizable, ObjectOutputStream, ObjectlnputStream.
Фильтрованные потоки
Классы Filter представляют потоки, позволяющие применять к данным, вводимым (читаемым) или выводимым (записываемым) с помощью другого потока, операции фильтрации (в широком смысле — обработки данных).
Классы семейства фильтрованных потоков позволяют надстраивать потоки, т.е. строить цепочки потоков и получать составные потоки, которые обладают расширенными функциональными возможностями. Объединяясь в цепочки, фильтрованные потоки образуют сложный единый фильтр.
Надстройка объекта — это наложение дополнительных объектов для получения новых свойств и функциональных возможностей.
Надстройка требует, чтобы все объекты, совмещаемые с исходным объектом, имели одинаковый интерфейс (набор методов доступа к объекту).
В системе ввода-вывода Java интерфейс для надстроек предоставляют классы семейства Filter, производные от основных суперклассов пакета java.io. Наследование от классов Filter — основное требование к классу-надстройке.
Фильтрованный поток данных привязывается к другому потоку, которому передает полномочия по фактическому выполнению операций ввода или вывода. Доступ к фильтрованным потокам осуществляется с помощью методов, использующих исходный (порождающий) поток, который связан с суперклассом фильтрованных потоков (см. пример FilterDemo.java)
Входные фильтрованные потоки разрешается связывать в цепочку, причем источником исходных данных может быть поток, не относящийся к семейству Filter.
Выходные фильтрованные потоки также могут соединяться в цепочки. Данные, выводимые (записываемые) в один поток, будут отфильтрованы (обработаны) и переданы следующему потоку. Последним в цепочке может быть объект любого выходного потокового класса.
43