- •Особенности языка 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
При передаче массива методу как параметра указывается имя и тип массива (как в объявлении), размер не указывается (см. пример).
Классы в Java
Особенности реализации
Вотличие от C++, Java — полностью объектно-ориентированный язык. В нем все хранится в объектах. Отсутствуют глобальные функции и переменные. Это обеспечивает большую надежность ПО, написанного на Java
Объект всегда является экземпляром некоторого класса (или массивом). Объект класса имеет данные (переменные) и поведение (методы), определяемые его классом. Поведение — это множество операций, которые объект может выполнять над данными.
Класс — это шаблон, в котором определяются данные и поведение объекта. Объекты одного класса используют общую структуру данных и общее поведение. Применение классов позволяет избегать повторного кодирования.
Суперклассом (родительским, базовым классом) называется класс, на основе которого создается другой класс, называемый производным (потомком, подклассом). Производный класс наследует структуру данных и поведение своего суперкласса и может добавлять свои собственные структуру данных и поведение, а также изменять поведение (переопределять методы), наследуемое от суперкласса.
Вязыке Java (с целью обеспечения высокой производительности и большей ясности исходного кода) поддерживается только простое наследование. Это означает, что любой класс-потомок является производным только от одного непосредственного суперкласса. Отсутствие множественного наследования в Java компенсируется использованием интерфейсов. (Интерфейс представляет собой набор методов без реализации, который впоследствии может быть реализован классом. Класс может одновременно реализовывать несколько интерфейсов.) Кроме того, в Java допускается несколько уровней наследования, что позволяет создавать иерархии классов. Например:
java.lang.Object |
– косвенный суперкласс для любого класса |
java.awt.Component |
– косвенный суперкласс |
java.awt.Container |
.. |
java.awt.Panel |
.. |
java.applet.Applet |
– непосредственный суперкласс |
My Applet |
– производный класс |
Непосредственный суперкласс указывается в объявлении класса ключевым словом extends. Если для класса не указан его суперкласс, по умолчанию этот класс расширяет класс java.lang.Object. Любой класс Java всегда является производным от класса Object и может использовать все методы этого класса.
В Java имя класса также является именем нового ссылочного типа. Все переменные, имеющие ссылочный тип, указываемый именем класса, являются объектами (точнее, хранят ссылки на объекты класса). Тип такого объекта может быть определен с помощью новой (в C++ нет!) операции instanceof. Например:
...
String str = "Строка"; boolean bl;
...
bl = str instanceof String; // результат - true
Приведение типов классов – см. пример ClassTypesDemo.java.
Правила:
1.Объект всегда может быть приведен к типу своего суперкласса.
2.Обратное приведение к типу класса объекта можно выполнить только с помощью оператора явного приведения типа.
10
Скачано с сайта http://ivc.clan.su
4.Любой тип класса может быть приведен к типу класса Object.
5.После приведения объекта к типу суперкласса все переменные и методы собственного класса
объекта становятся для него недоступными.
Определение класса содержит объявление класса и тело класса.
Объявление класса в Java в общем виде может быть представлено так:
*модификаторы+ class Имя_класса [extends Имя_суперкласса+ [implements Имя(Список)_интерфейса(ов)+
1.Модификаторы класса
•public — спецификатор доступа — указывает, что к данному классу возможен доступ из других пакетов. (Доступ может быть выполнен с помощью оператора import либо указанием
квалифицированного имени класса, включающего имя пакета.) В случае отсутствия спецификатора public, доступ разрешен только внутри пакета, в котором данный класс находится!
•abstract — модификатор реализации класса — указывает, что класс не может иметь экземпляров. Класс, имеющий хотя бы один абстрактный метод (т.е. метод без реализации), должен быть объявлен как abstract.
•final — модификатор ограничения иерархии классов — указывает что класс не может иметь производных классов (например, класс java.iang.String).
2.Имя класса
Как и другие идентификаторы Java, имена классов имеют следующие ограничения: должны начинаться с буквы, символа подчеркивания или знака $;
должны содержать только Unicode-символы;
не должны совпадать с ключевыми словами Java.
Рекомендуется имя любого класса начинать с прописной буквы!
3. Спецификация суперкласса
Суперкласс указывается ключевым словом extends. Он должен быть доступным классом и не иметь модификатора final.
4. Реализация интерфейсов
Интерфейсы указываются ключевым словом implements. Если класс, для которого указывается реализуемые интерфейсы, не является абстрактным, то все методы, объявленные в интерфейсах, должны быть определены или в самом этом классе, или в некотором его суперклассе.
Тело класса заключено в , - и может, в принципе, не содержать ни одного элемента. Обычно содержит список переменных класса (полей) и определения методов. Имя метода-конструктора совпадает с именем класса.
Создание экземпляра класса
Объект, имеющий тип данного класса, создается при помощи оператора new.
String str = new String ("Строка");
При этом:
выделяется память, достаточная для размещения содержимого полей объекта;
вызывается метод-конструктор;
возвращаемая оператором new ссылка на объект присваивается переменной.
При обращении к полям и методам объекта в Java используется только оператор «точка».
Пакеты
1.Пакеты используются для объединения связанных между собой классов, интерфейсов и других пакетов. Пакетом называется некоторый набор родственных классов.
2.Пакеты обеспечивают защищенный доступ к классам. В пределах пакета разрешен неограниченный доступ классов друг к другу. Доступ к классу из других пакетов можно обеспечить с помощью спецификатора public в объявлении класса.
3.Пакет создает собственное пространство имен (в разных пакетах можно использовать одни и те же имена классов). Квалифицированное имя класса включает имя пакета (например, java.applet.Applet).
4.Пакеты в Java аналогичны библиотекам в С и C++, однако их проще создавать и использовать. Пакет импортируется в программу с помощью оператора import.
11
Скачано с сайта http://ivc.clan.su
В отличие от оператора #include, оператор import не связывает с приложением тех классов, которые в нем не используются. Использование оператора import со звездочкой или с непосредственно указанным именем класса не влияет на размер откомпилированного файла. Оператор import применяется только из соображений лучшей читаемости программы.
Операторы import информируют компилятор, в каких пакетах следует искать открытые
классы, используемые в программе без указания квалифицированного имени.
5.Программист может создать собственный пакет с помощью оператора package и поместить в него
любое количество классов (интерфейсов). Например:
package mypackage; |
// Оператор должен быть в самом начале файла .java. В имени |
|
// пакета рекомендуется использовать только строчные буквы. |
public class MyClass |
// Компилятор требует, чтобы в исходном файле Java |
{...} |
// размещался только один открытый класс. Имя файла должно |
|
// соответствовать имени открытого класса. |
Если оператор package не используется, то классы, входящие в текущий файл, образуют пакет по умолчанию - анонимный пакет. Такие пакеты используются для небольших простых приложений.
6.Пакеты можно устанавливать в каталогах и подкаталогах, создавая древовидную структуру пакетов, отображающую файловую структуру операционной системы. Файл класса, входящего в
пакет, размещается в соответствующем каталоге, имеющем название пакета.
7.При именовании пакетов, которые могут быть использованы другими программистами в среде Internet, действует следующее соглашение:
если URL-адрес поставщика пакета (уникальное доменное имя) www.имя_Web-узла.суффикс
то полное имя пакета начинается с обращенного доменного имени:
суффикс.имя_Web-узла.имя_пакета
8.При поиске пакетов компилятор (интерпретатор) Java использует в качестве корневых каталогов поиска каталоги, указанные в переменной окружения CLASSPATH (по умолчанию — каталоги типа jdk1.5/jre/lib с файлом rt.jar; текущий каталог, имя которого задается с помощью символа «.»).
Установка пути доступа к классам:
1)set CLASSPATH= ... (можно указывать не только имена каталогов, но и имена архивных файлов .jar).
2)Использование опции -classpath при запуске компилятора или интерпретатора Java (рекомендуемый в настоящее время способ).
Управление доступом к элементам класса
Класс в Java может включать в себя поля, методы, методы-конструкторы, а также блоки инициализации и внутренние (вложенные) классы.
К элементам класса относятся поля, методы (и внутренние классы).
Поле — переменная, содержащая данные класса или экземпляра класса (объекта типа данного класса).
Метод — это именованный фрагмент исполнимого кода класса, вызов которого возможен как внутри класса, так и для объектов класса.
Все поля и методы доступны для методов данного класса. Для ограничения доступа к полям и методам из других классов используются спецификаторы доступа.
Откуда возможен доступ |
|
Другие классы в |
Классы в других пакетах |
||
к элементам |
Данный класс |
пакете, которому |
|||
|
|
||||
Спецификатор доступа |
|
принадлежит класс |
Потомки |
Не потомки |
|
|
|
|
|
|
|
public |
+ |
+ |
+ |
+ |
|
protected |
+ |
+ |
+ |
- |
|
private |
+ |
- |
- |
- |
|
по умолчанию |
+ |
+ |
- |
- |
В Java имеется 4 уровня доступа, которые перечисляются в порядке возрастания ограничений:
12
Скачано с сайта http://ivc.clan.su
1.Открытый — элемент класса доступен везде, где доступен данный класс.
2.Защищенный — элемент доступен из классов данного пакета и из любого потомка данного класса.
3.Пакетный (стандартный) — элемент доступен из классов данного пакета.
4.Закрытый — доступ к элементу разрешен в пределах данного класса.
Поля класса
В классе различают несколько разновидностей переменных:
поля (переменные) класса, которые объявляются вне методов и доступны всем методам класса.
локальные переменные метода (а также конструктора, блока инициализации, блока операторов ,...-, выражения условия для управляющей конструкции цикла for), которые объявляются внутри метода, доступны только в этом методе и существуют только во время выполнения метода.
Обязательно должны быть явно инициализированы до использования.
параметры методов, конструкторов, обработчиков исключений. Объявление поля класса имеет вид:
*спецификатор доступа+ *модификаторы+ тип_данных имя_поля *=значение_инициализации+;
1.Спецификаторы доступа (public, protected, private)
Применяют для ограничения доступа к полю из других классов (см. п. «Управление доступом к элементам класса»).
ВC++ спецификатор доступа можно распространять на целый блок объявлений переменных. В Java спецификатор доступа указывается для каждого объявления отдельно.
2.Модификаторы полей класса
static
Переменная, имеющая этот модификатор, является полем класса в целом и существует в единственном экземпляре, независимо от того, сколько объектов класса создано и создавались ли они вообще.
Поле, указанное как static, принято называть статическим полем или просто полем (переменной) класса. Статическое поле создается при загрузке класса, прекращает существование — при выгрузке.
Поле, не имеющее этого модификатора, называют полем (переменной) экземпляра класса (иногда — нестатическим полем). Такое поле создается для каждого нового экземпляра (объекта) класса и прекращает существование, когда не остается ссылок на этот объект.
Для обращения к статическому полю создавать экземпляр класса не требуется. Для доступа к полю используется имя класса. Например, в классе System имеется статическое поле out типа PrintStream (стандартный поток вывода):
System.out.println();
Инициализация статических полей — см. пример StaticInitDemo.java с комментариями.
final
Этот модификатор поля класса запрещает изменение значения поля после его инициализации (попытка присваивания нового значения приводит к ошибке при компиляции).
Неизменяемые final-переменные можно рассматривать как константы, причем для экономии памяти константы обычно делают статическими (нет необходимости хранить копию final-поля в каждом экземпляре класса).
Например, в классе Integer имеются поля, используемые как константы: public static final int MAX_VALUE = 2147483647;
public static final int MIN_VALUE = -2147483648;
transient
Данный модификатор указывает, что экземпляр переменной не является частью устойчивого состояния объекта и поэтому не должен записываться на постоянное хранение при сериализации объекта, т.е. записи его состояния в файл. Не используется совместно с final и static.
volatile
Используется в многопоточном программировании. Сообщает компилятору, что к полю могут одновременно обращаться несколько потоков текущего процесса и это поле не следует использовать при оптимизации программы.
Методы доступа к private-полям
13