
- •Использование абстрактных классов
- •// Простая демонстрация абстракций Java.
- •Использование final для отказа от переопределения
- •Void meth() { // ошибка! Нельзя переопределять.
- •Использование final для отмены наследования
- •Интерфейсы
- •IntStack mystack; //создать ссылочную переменную
- •Интерфейсы и обратные вызовы (Хорстманн стр. 253 (279-new))
- •Внутренние классы (Хорстманн стр. 282-new)
IntStack mystack; //создать ссылочную переменную
DynStack ds = new DynStack(5);
FixedStack fs = new FixedStack(8);
mystack = ds; // загрузить динамический стек
// поместить несколько чисел в стек
for(int i=0; i<12; i++)
mystack.push(i);
mystack = fs; // загрузить фиксированный стек
for (int i=0; i<8; i++)
mystack.push(i);
mystack = ds;
System.out.println("Значения динамического стека:");
for(int i=0; i<12; i++)
System.out.println(mystack.pop());
mystack = fs;
System.out.println("Значения фиксированного стека:");
for(int i=0; i<8; i++)
System.out.println(mystack.pop());
}
}
В этой программе mystack — ссылка на интерфейс IntStack. Таким образом, когда она обращается к ds, то использует версии push() и pop(), определенные реализацией DynStack. Когда она обращается к fs, то использует версии push() и рор(), определенные в FixedStack. Напомним, что эти определения делаются во время выполнения. Доступ к множественным реализациям интерфейса через интерфейсную ссылочную переменную — самое мощное средство, с помощью которого Java достигает полиморфизма времени выполнения.
Интерфейсы и обратные вызовы (Хорстманн стр. 253 (279-new))
Интерфейсы широко используются в языке Java
Обратный вызов (callback) широко распространен в программировании. При обратном вызове программист задает действия, которые должны выполняться всякий раз, когда происходит некоторое событие. Например, можно задать действие, которое должно быть выполнено, если будет нажата конкретная кнопка или выбран определенный пункт меню.
Пакет javax.swing содержит класс Timer, который можно использовать для отсчета интервалов времени. Например, если в программе предусмотрены часы, то с помощью класса Timer можно отсчитывать каждую секунду и обновлять циферблат часов.
Устанавливая таймер, мы задаем интервал времени и указываем, что должно произойти по его истечении. Как указать таймеру, что он должен делать? Во многих языках программирования задается имя функции, которую таймер должен периодически вызывать. Однако классы из стандартной библиотеки языка Java используют объектно-ориентированный подход. Программист должен передать таймеру объект некоторого класса. После этого таймер вызывает один из методов данного объекта. Передача объекта — более гибкий механизм, чем вызов функции, поскольку объект может нести с собой дополнительную информацию.
Разумеется, таймер должен знать, какой метод он должен вызвать. Для этого таймеру нужно указать объект класса, реализующего интерфейс ActionListener из пакета java.awt.event. Вот как выглядит этот интерфейс.
public interface ActionListener
void actionPerformed(ActionEvent event);
По истечении заданного интервала времени таймер вызывает метод actionPerformed.
Допустим, нам нужно каждые десять секунд выводить на экран сообщение "Текущее время: ...", сопровождаемое звуковым сигналом. Для этого необходимо определить класс, реализующий интерфейс ActionListener. Затем поместите операторы, которые нужно выполнить, внутрь метода actionPerformed.
class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println.("Текущее время : " + now);
Toolkit.getDefaultToolkit().beep();
}
}
Обратите внимание на параметр ActionEvent метода actionPerformed. Он содержит информацию о событии, например, об объекте, его породившем. Детальная информация о событии в данной программе не важна, поэтому можно просто проигнорировать этот параметр.
Затем следует создать объект данного класса и передать его конструктору класса Timer.
ActionListener listener = new TimePrinter();
Timer t = new Timer(10000, listener);
Первый параметр конструктора Timer представляет собой интервал времени между точками отсчета, измеренный в миллисекундах. Сообщение должно выдаваться на экран каждые десять секунд. Второй параметр является объектом класса ActionListener.
Итак, запустим таймер.
t.start();
Каждые десять секунд на экране будет появляться следующее сообщение, сопровождаемое звуковым сигналом.
Текущее время: Thu Apr 13 23:29:08 PDT 2000
Ниже приведена программа, реализующая описанный алгоритм. После запуска таймера программа выводит на экран окно сообщения и ждет, пока пользователь не щелкнет на кнопке "Ok" , при этом на экран каждую секунду выводится текущее время и дата.
Заметим, что в дополнение к пакетам javax.swing.* и Java.util.* программа импортирует класс javax.swing.Timer по имени. Это позволяет избежать неоднозначности, которая могла бы возникнуть между пакетами javax.swing.Timer и java.util.Timer, которые к данной задаче отношения не имеют.
/* version 1.00 2000-04-13 author Cay Horstmann */
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;
// для разрешения конфликта с классом java.util.Timer
public class TimerTest
{
public static void main(String[] args)
{
ActionListener listener = new TimePrinter();
// Создание таймера, вызывающего обработчик (listener)
// каждую секунду
Timer t = new Timer(1000, listener);
t.start();
JOptionPane.showMessageDialog(null, "Закончить программу?");
System.exit(0);
}
}
class TimePrinter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
Date now = new Date();
System.out.println("Текущая дата и время " + now);
Toolkit.getDefaultToolkit().beep();
}
}
Ниже приведены некоторые классы и методы из используемых пакетов
javax.swing.JOptionPane 1.2
static void showMessageDialog(Component parent, Object message)
Отображает на экран окно диалога со строкой сообщения и кнопкой "Ok". Окно диалога выравнивается по центру компонента parent. Если ссылка parent является нулевой, окно диалога выравнивается по центру экрана.
javax.swing.Timer 1.2
Timer(int interval, ActionListener listener)
Создает таймер, передающий сообщение объекту listener по истечении интервала времени, продолжительность которого задается параметром interval.
void start()
Запускает таймер, который затем вызывает метод actionPerformed, передавая ему объект listener.
void stop ()
Останавливает таймер. После остановки таймер больше не вызывает метод actionPerformed.
java.awt.Toolkit 1.0
static Toolkit getDefaultToolkit ()
Подключает инструментальный набор, используемый по умолчанию. Этот набор содержит информацию о среде пользовательского графического интерфейса.
void beep()
Включает звуковой сигнал.
Компания Microsoft долгое время была сторонником применения интерфейсов вместо
множественного наследования. Фактически интерфейсы, предложенные разработчиками языка Java, эквивалентны интерфейсам, используемым в СОМ-технологии, разработанной компанией Microsoft. В результате этого невероятного совпадения взглядов СОМ-объекты (например, компоненты управления ActiveX) легко можно создавать с помощью инструментальных средств языка Java. Это сделано (причем очень ясно и
понятно) в языке J++ фирмы Microsoft. Кроме того, этот подход положен в основу инструментальных средств JavaBeans-to-ActiveX компании Sun.