- •Особенности языка 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
Обычно это означает, что классы загружаются только непосредственно из пути классов (задаваемого переменной CLASSPATH).
Сначала JVM пытается найти Bean как сериализованный объектный ресурс beanName.ser и десериализовать его. Если сериализованный объект не найден, создается экземпляр класса с помощью конструктора без параметров.
Если класс компонента не найден или для него не предусмотрен принимаемый по умолчанию конструктор, метод Beans.instantiate() не сможет загрузить данный компонент.
Пример с сериализованным Bean-компонентом — см. BeanlnstantiateDemo.java
Приложение
// Файл HelloApplet.java
//Пример простейшего апплета
//Апплет рисует в окне текстовую строку
//Началъные операторы программы: import java.applet.Applet; import java.awt.Graphics;
/*
Они указывают компилятору импортируемые (подключаемые) классы и пакеты. Позволяют программе обращаться к другим классам без указания полных квалифицированных) имен классов. Квалифицированное имя включает название пакета. В отличие от языка С, импортирование не приводит к увеличению размера программы. Определение класса, производного от класса Applet. В классе Java.applet.Applet реализованы возможности выполнения апплетов в среде Web-браузера. Класс апплета должен быть открытым (public), чтобы быть доступным браузеру. Имя класса должно точно совпадать с именем файла .java.
*/
public class HelloApplet extends Applet
{
/*
Переопределение метода paint, который наследуется апплетом от класса Java.awt.Component, от которого по цепочке наследования происходит класс Java.applet.Applet. Метод paint отображает апплет на экране браузера. Этот метод вызывается Java-машиной браузера, создающей объект апплета, и используется для рисования в графическом пространстве апплета, предоставляемом браузером. Доступ к графическому пространству осуществляется с помощью объекта типа Graphics.
*/
public void paint(Graphics g)
{
/*
Передаваемый в качестве параметра объект типа Graphics содержит графический контекст апплета.
Методы класса Java.awt.Graphics позволяют рисовать
вокне апплета.
*/
//Рисование строки "Hello, Java!" с начальными
//координатами х = 50 и у = 50 (в пикселях)
//относительно левого верхнего угла окна апплета g.drawstring("Hello, Java!", 50, 50);
}
}
//Файл HelloApplication.java
//Пример простейшего приложения.
//Приложение выводит текстовую строку в стандартный поток вывода.
//Определение класса
public class HelloApplication
{
public static void main(String args [])
52
Скачано с сайта http://ivc.clan.su
{
//Вывод пустой строки и текстовой строки
//в стандартный поток вывода
System.out.println(); System.out.println("Hello from Java!");
}
}
/*
*Приложение содержит по крайней мере один класс.
*Имя файла .java должно точно совпадать с именем основного public-класса, содержащего метод main.
*Выполнение приложения начинается в методе main, т.е. этот метод является точкой входа в программу.
*Основной класс приложения должен быть открытым (public), чтобы выполняющая среда Java могла гарантированно обнаружить класс и запустить метод main.
*Метод main объявляется как public (это позволяет среде выполнения Java обнаружить метод) и static (это позволяет вызвать метод до создания экземпляра класса).
*Приложению можно передавать параметры (аргументы командной строки). JVM помещает их в массив типа String, после чего передает массив строк методу main.
*В любую Java-программу автоматически импортируется пакет java.lang, который содержит наиболее общие классы. В этом пакете имеется класс System, в котором предусмотрен объект out типа Printstream (стандартный поток вывода). Метод
println объекта out позволяет выводить текстовые строки в стандартный выходной поток.
*/
// Файл MyApplet.java
//Скелетная схема апплета:
//переопределение методов "жизненного цикла" апплета. import java.awt.*;
import Java.applet.*;
public class MyApplet extends Applet
{
//He требуется определять конструктор класса.
//Компилятор Java по умолчанию создаст конструктор
//без параметров.
public void init()
{
// Код этапа инициализации апплета
}
public void start()
{
// Код этапа запуска апплета
}
public void paint(Graphics g)
{
// Код этапа перерисовки апплета
g.drawstring("Рисование строки в окне апплета", 10, 50);
}
public void stop()
{
// Код этапа останова апплета
}
public void destroy()
{
// Код этапа уничтожения апплета
}
}
// Файл StringDemo.java
// Примеры работы со строками import java.awt.*;
import java.applet.Applet;
53
Скачано с сайта http://ivc.clan.su
public class StringDemo extends Applet
{
public void paint(Graphics g)
{
int index; int y = 0;
boolean result;
String str = "All string literals in Java programs are implemented as instances of String class";
String str2; char ch;
char chr[] = new char[20];
// Работа с объектами String
g.drawString("Работа с объектами String", 50, y += 25); g.drawString("Исходная строка: " + str, 20, y += 25); g.drawString("Длина строки: " + str.length(), 20, y += 15); index = str.indexOf('i');
g.drawString("Индекс символа i: " + index, 20, y += 15); index = str.indexOf('i', index + 1);
g.drawString("Индекс следующего символа i: " + index, 20, y += 15); g.drawString("Индекс начала подстроки \"Java\" : " +
str.indexOf("Java"), 20, y += 15);
//Методы группы lastlndexOf() возвращают индекс последнего вхождения
//указанного символа или строки
ch = str.charAt(10);
g.drawString("Символ в позиции 15: " + ch, 20, y += 15); str.getChars(5, 20, chr, 0); //копирует символы (с 5-го по 2 0-ый)
//из данной строки в указанный массив //с 0-м смещением
String tmp = new String(chr);
g.drawString("Строка, созданная из массива символов исходной строки: "
+ tmp, 20, y += 15);
str2 = str.substring(13, 20);
g.drawString("Подстрока с позиции 13 до позиции 20: " + str2, 20, y += 15); str2 = str.toUpperCase(); //преобразование строки в верхний регистр
//(метод toLowerCase() обеспечивает //преобразование в нижний регистр) g.drawString("Строка в верхнем регистре: " + str2, 20, y += 15);
result = str.equals("all string literals in Java programs are implemented as instances of string class");
g.drawString("Сравнение с такой же строкой с учетом регистра: " + result, 20, y += 15);
result = str.equalsIgnoreCase("all string literals in Java programs are implemented as instances of string class");
g.drawString("Сравнение с такой же строкой без учета регистра: " + result, 20, y += 15);
str2 = str.replace('i', 'w');
g.drawString("Замена сивола i на символ w: " + str2, 20, y += 15); str2 = str.concat(" 2002 ");
g.drawString("Объединение строк: " + str2, 20, y += 15); g.drawString("Удаление с обоих концов строки символов пробела: " +
str2.trim(), 20, y += 15);
result = str.startsWith("All"); //Определяет, является ли указанная
//строка префиксом данной строки.
//Метод endWith() определяет, является ли указанная строка суффиксом //данной строки.
str2 = String.valueOf(result);
g.drawString("Строка, представляющая значение типа boolean: " + str2, 20, y += 15);
index = 100;
str2 = String.valueOf(index);
g.drawString("Строка, представляющая значение типа int: " + str2, 20, y += 15);
54
Скачано с сайта http://ivc.clan.su
// Работа с объектом StringBuffer
g.drawString("Работа с объектом StringBuffer", 50, y += 25); StringBuffer strB = new StringBuffer(str);
strB.setCharAt(5, 'X');
g.drawString("Замена 5 сивола на символ X: " + strB, 20, y += 25); int value = 2002;
strB.append(value);
g.drawString("Добавление подстроки: " + strB, 20, y += 15); strB.insert(10, value);
g.drawString("Вставка подстроки: " + strB, 20, y += 15);
strB.reverse(); |
|
String st = new String(strB); |
//новая строка, содержащая |
|
//значение строкового буфера |
g.drawString("Реверс содержимого строкового буфера: " + st, 20, y += 15);
}
}
//Файл АrrayDemo.java
//Пример апплета, демонстрирующего:
//- различные варианты инициализации массива;
//- использование поля length при работе с массивом;
//- передачу массива методу как параметра.
import java.applet.*; import java.awt.*;
public class ArrayDemo extends Applet
{
//Инициализация при объявлении с неявным использованием оператора new int[] array1 = { 1000, 2000, 3000, 4000, 5000 };
//Инициализация при объявлении с явным использованием оператора new
//int[] array2 = new int[] { l0, 20, 30, 40, 50 };
//Инициализация элементов массива по умолчанию нулевыми значениями
//int[] аггау3 = new int[5];
//Объявление массива (создание ссылки на массив)
//int[] array4; public void init()
{
// Варианты создания и инициализации массива аггау4
//array4 = new int[] { l00, 200, 300, 400, 500 };
/*array4 = new int[5]; |
// инициализация в цикле с |
for (int i = 0; i < array4.length; i++) // обращением к элементам |
|
array4[i] = i * 100; |
// массива по индексам |
*/
}
public void paint(Graphics g)
{
//Передача массива методу как параметра showArray(g, array1);
//showArray(g, array2); //showArray(g, аггау3); //showArray(g, array4);
//Динамически создаваемый массив
//showArray(g, new int[] { l, 2, 3, 4, 5 });
}
public void showArray(Graphics g, int[] someArr)
{
// Вывод элементов массива
g.drawString("Массив содержит следующие элементы:", 10, 20); for (int i = 0; i < someArr.length; i++)
g.drawString("array[" + i + "] = " + someArr[i], 10, (i + 2) * 20);
}
}
//Файл ClassTypesDemo.java
//Пример апплета, демонстрирующего правила приведения типов классов
55
Скачано с сайта http://ivc.clan.su
import java.applet.*; import java.awt.*;
//Иерархия классов class A { }
class В extends A { } class С extends В { }
//Основной класс
public class ClassTypesDemo extends Applet
{
В bObj;
A aObjl, aObj2; С cObj;
Object obj1, obj2;
String str1 = "Hello, Java! ", str2; public void init()
{
aObj1 = new A();
//Этот оператор вызовет ошибку при компиляции: //bObj = new А();
//Этот оператор вызовет при выполнении апплета ошибку -
//- Java.lang.ClassCastException. Ссылку объекта типа
//суперкласса нельзя привести к типу производного класса: //bObj = (В)new A();
//"Повышающее" приведение типов разрешено и не требует
//использования оператора явного приведения типа.
//Здесь переменной типа непосредственного суперкласса
//присваивается ссылка на экземпляр производного класса: aObj2 = new В();
//Здесь обратное, "понижающее", приведение типа разрешено.
//Обязательно требуется использовать оператор явного
//приведения типа. Иначе - ошибка при компиляции!
bObj = (В)aObj2;
//Приведение ссылочных типов может выполняться по иерархии
//классов сколь угодно глубоко:
cObj = new С(); aObj2 = cObj;
//Любой тип класса можно привести к типу Object: obj1 = (Object)new C();
obj1 = new C(); // можно без оператора явного приведения типа obj2 = str1;
//Здесь обязательно требуется использовать оператор явного
//приведения типа. Иначе - ошибка при компиляции!
str2 = (String)obj2;
//Следует отметить: после приведения объекта к типу
//суперкласса все переменные и методы самого класса объекта
//становятся недоступными для приведенного объекта!
}
public void paint(Graphics g)
{
g.drawString("aObj1 instanceof A : " + (aObj1 instanceof A), 20, 20); g.drawString("aObj1 instanceof Object : " + (aObj1 instanceof Object), 20,
40);
g.drawstring("bObj instanceof В : " + (bObj instanceof B), 20, 80); g.drawString("bObj instanceof A : " + (bObj instanceof A), 20, 100); g.drawstring("aObj2 instanceof A : " + (aObj2 instanceof A), 20, 140); g.drawstring("aObj2 instanceof В : " + (aObj2 instanceof B), 20, 160); g.drawString("aObj2 instanceof С : " + (aObj2 instanceof C), 20, 180); g.drawstring("Объекты-строки : " + obj2 + str2, 20, 220);
}
}
//Результаты работы апплета:
//aObj1 instanceof A : true
//aObj1 instanceof Object : true
//bObj instanceof В : true
56
Скачано с сайта http://ivc.clan.su
//bObj instanceof A : true
//aObj2 instanceof A : true
//aObj2 instanceof В : true
//aObj2 instanceof С : true
//Объекты-строки : Hello, Java! Hello, Java!
//Файл StaticInitDemo.java
//Пример апплета, демонстрирующего инициализацию статических переменных import java.applet.*;
import java.awt.*; class A
{
int a1 = 1, b1; // нестатические поля класса
//Для класса создается только один экземпляр статической переменной -
//переменной класса.
//Статические переменные могут быть инициализированы или при объявлении,
//или блоком кода, отмеченного ключевым словом static и расположенного
//вне всякого метода.
//Инициализация статических переменных выполняется один раз при загрузке
//соответствующего класса.(Файл класса загружается, когда возникает
//необходимость в классе:
//- при создании объекта-экземпляра класса;
//- при обращении к статическим полям и методам класса.)
static int а = 1; static double b; static int с = 3;
//Блок статической инициализации static
{a++; с = 10;} // Предыдущее значение переменной,с теряется static String s = "String";
static Integer i = new Integer(20);
//Блок статической инициализации
static
{b = Math.cos(Math.PI / 4.0);} // При инициализации статических переменных
//можно вызывать статические методы
//Java, начиная JDK 1.1, поддерживает сходный синтаксис для инициализации
//нестатических переменных - переменных экземпляра класса.
{a1++; b1 = 30;}
//Конструктор класса, удваивающий инициализированное
//значение статической переменной
A()
{
а *= 2;
}
}
// Основной класс
public class StaticInitDemo extends Applet
{
A aObj; int aClass;
int alnstance; public void init()
{
//Для обращения к статической переменной не обязательно создавать
//экземпляры класса. Лучше обращаться через имя класса:
aClass = A.а;
//Создание экземпляра класса А: aObj = new A();
//Следует отметить, что блоки статической инициализации
//выполняются раньше конструкторов!
//Обращение к статической переменной с помощью объекта класса: alnstance = aObj.a;
}
public void paint(Graphics g)
57