
- •Java Beans
- •План лекции
- •Объектный подход
- •Понятие компонента
- •Требования к разработке компонентов
- •Контейнеры и компоненты
- •Существующие компонентные модели
- •JavaBeans
- •Интроспекция
- •Компоненты JavaBeans
- •Достоинства JavaBeans
- •Требования к компоненту JavaBeans
- •Удивительное рядом
- •Свойства
- •Простые свойства
- •Бин с простым свойством
- •Работа с простыми свойствами
- •Индексированные свойства
- •Бин с индексированным свойством
- •Работа с индексированными свойствами
- •Связанные свойства
- •Бин со связанным свойством
- •Бин со связанным свойством
- •Работа со связанными свойствами
- •Контролируемые свойства
- •Бин с контролируемым свойством
- •Бин с контролируемым свойством
- •VetoChangeListener
- •Графические компоненты
- •Графический бин
- •Графический бин
- •Работа с графическим бином
- •Модель делегирования обработки событий
- •Модель делегирования обработки событий
- •Слушатели и источники
- •События JavaBeans
- •Работа с событиями
- •Работа с событиями
- •Работа с событиями
- •Работа с событиями
- •Результат работы приложения
- •Персистентнось
- •Упаковка в Jar
- •Добавление библиотек в палитру
- •Вложенные типы
- •План лекции
- •Синтаксически корректный код
- •Вложенные типы
- •Статические вложенные классы
- •Вложенные интерфейсы
- •Нестатические вложенные классы
- •Пример внутреннего класса
- •И ещё один пример
- •И его результат…
- •Локальные классы
- •Локальные классы
- •Анонимные классы
- •Пример анонимного класса
- •Спасибо за внимание!
- •Дополнительные источники

Нестатические вложенные классы
Называются внутренними классами
Тип находится в контексте объекта
Объект внутреннего класса всегда ассоциируется с т.н. внешним объектом
Элементы внутреннего класса имеют доступ к полям и методам внешнего объекта
Это позволяет создавать семейства сильно связанных объектов
51

Пример внутреннего класса
class ClassA { private int a = 10;
protected class ClassB { private int b = 15;
public int getA() { return a; } public int getB() { return b; }
}
public ClassB getB() { return new ClassB(); } public void setB(int b, ClassB obj) { obj.b = b; }
}
public class Test {
public static void main(String[] args) {
ClassA objA = new ClassA();
ClassA.ClassB objB = objA.getB(); objA.setB(20, objB);
System.out.println(objB.getA() + " " + objB.getB());
}
}
52

И ещё один пример
class ClassA implements Serializable {
private ClassB[] arr = new ClassB[10];
{
for(int i = 0; i < 10; i++) { arr[i] = new ClassB(); arr[i].a = i + 65;
}
}
public Interface getB(int index) { return arr[index]; }
private class ClassB implements Interface { private int a;
public int getA() { return a; }
}
}
interface Interface extends Serializable { int getA(); }
53

И его результат…
public class Test {
public static void main(String[] args) throws Exception { ClassA objA = new ClassA();
Interface objB = objA.getB(5);
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("test.bin"));
out.writeObject(objB);
out.close();
}
}
¬н ♣sr ♪ClassA$ClassBиeТнwјЛ☻ ☻I ☺aL ♠this$0t ◘LClassA;xp
Fsr ♠ClassAhќЯѓэЄрЈ ☻ ☺[♥arrt ►[LClassA$ClassB;xpur |
|
|||
►[LClassA$ClassB;єВ2 ♂т|Ў ☻ xp sq ~ |
Aq ~ ♣sq ~ |
Bq ~ |
||
♣sq ~ |
Cq ~ ♣sq ~ |
Dq ~ ♣sq ~ |
Eq ~ ♣q ~ ☻sq ~ |
|
Gq ~ ♣sq ~ |
Hq ~ ♣sq ~ |
Iq ~ ♣sq ~ |
Jq ~ ♣ |
|
54

Локальные классы
Описываются в теле блока
Экземпляры имеют доступ к полям и методам внешнего объекта
Экземпляры имеют доступ к локальным переменным, снабженным модификатором final
public class ClassA {
public Iterator iterator() { class Iter implements Iterator {
...
}
...
return new Iter();
}
...
}
55

Локальные классы
|
class A { protected char a = 'a'; } |
|
|
|
|
|
class B { protected char b = 'b'; } |
|
|
|
|
|
public class C extends A { |
|
|
|
|
|
private char c = 'c'; |
|
|
|
|
|
public static char d = 'd'; |
|
|
|
|
|
public void createLocalObject(final char e) |
|
|
|
|
|
{ |
|
|
|
|
|
final char f = 'f'; |
|
|
|
|
|
class Local extends B |
|
|
|
|
|
{ |
char g = 'g'; |
|
|
|
|
|
|
|
|
|
|
|
public void printVars() |
|
|
|
|
|
{ |
|
|
|
|
|
System.out.println(g + "," + f + "," + e); // local |
|
|
|
|
|
System.out.println(d + "," + c); |
// outer |
|
|
|
} |
} System.out.println(b + "," + a); |
// inherited |
|
|
|
} } new Local().printVars(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |

Анонимные классы
Описываются непосредственно в выражении new и служат его частью
Тип, указанный после new является базовым для объявляемого анонимного класса
Могут расширять один класс или реализовывать один интерфейс
Явно писать implements или extends нельзя
Не могут иметь конструкторов
57

Пример анонимного класса
import java.awt.*; import javax.swing.*;
public class MyApplet extends JApplet {
...
public void init() {
JButton btn = new JButton("?"); getContentPane().add(btn); btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { ((JButton)e.getSource()).setText("!");
}
});
}
}
58

Спасибо за внимание!

Дополнительные источники
Хорстманн, К. Java 2. Библиотека профессионала. Том 2. Тонкости программирования [Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 992 с.
Дейтел, Х.М. Технологии программирования на Java 2. Книга 1. Графика, JavaBeans, интерфейс пользователя [Текст] / Х.М. Дейтел, П.Дж. Дейтел, С.И. Сантари. – М. : Бином- пресс, 2003. – 560 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html , дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html , дата доступа: 21.10.2011.
JavaSE Desktop technologies [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html , дата доступа: 21.10.2011.
Trial: JavaBeans [Электронный ресурс]. – Режим доступа: http://download.oracle.com/javase/tutorial/javabeans/ , дата доступа: 21.10.2011.