Внутренние классы

Этот раздел иллюстрирует, как можно использовать внутренние классы, чтобы упростить код применяющий адаптеры событий. Чтобы понять выгоду, обеспечиваемую внутренними классами, рассмотрим апплет, показанный в следующем листинге. Он не использует внутренний класс. Его цель состоит в том, чтобы отобразить строку "Mouse Pressed" в строке состояния программы просмотра апплета или браузера, когда нажимается клавиша мыши. В этой программе имеются два класса верхнего уровня. Класс MousePressedDemo расширяет класс Applet, a MyMouseAdapter расширяет MouseAdapter. Метод init() класса MousePressedDemo создает экземпляр (объект) класса MyMouseAdapter и передает его (как аргумент) методу addMouseListener().

Обратите внимание, что в качестве аргумента конструктора MyMouseAdapter указана ссылка на данный апплет. Она сохраняется в переменной экземпляра для более позднего использования методом mousePressed(). Когда нажимается кнопка мыши, через эту ссылку вызывается метод апплета showStatus (). Другими словами, showStatus() вызывается относительно ссылки на апплет, сохраненной адаптером MyMouseAdapter.

//package adapter;

//Этот апплет не использует внутренний класс.

import java.applet.*;

import java.awt.event.*;

/*

<applet code="MousePressDemo" width=200 height=100>

</applet>

*/

public class MousePressDemo extends Applet {

public void init () {

addMouseListener(new MyMouseAdapter1(this));

}

}

class MyMouseAdapter1 extends MouseAdapter {

MousePressDemo mousePressDemo;

public MyMouseAdapter1(MousePressDemo mousePressDemo) {

this. mousePressDemo = mousePressDemo;

}

public void mousePressed(MouseEvent me) {

mousePressDemo.showStatus("Mouse Pressed.");

}

}

Следующий листинг демонстрирует, как предшествующая программа может быть улучшена, используя внутренний класс. Здесь InnerciassDemo — класс

верхнего уровня, который расширяет класс Applet. MyMouseAdapter — внутренний класс, который расширяет MouseAdapter. Поскольку MyMouseAdapter

определен в области видимости innerCiassDemo, он имеет доступ ко всем переменным и методам в пределах этого класса. Поэтому метод mousePressed() может прямо вызвать метод showStatus(). Больше не требуется делать это через сохраненную ссылку на апплет. Таким образом, нет необходимости передавать конструктору MyMouseAdapter() ссылку на вызывающий объект.

//package adapter;

//Демонстрация внутреннего класса.

import java.applet.*;

import java.awt.event.*;

/*

<applet code="InnerClassDemo" width=200 height=100>

</applet>

*/

public class InnerClassDemo extends Applet {

public void init() {

addMouseListener(new MyMouseAdapter());

}

class MyMouseAdapter extends MouseAdapter {

public void mousePressed(MouseEvent me) {

showStatus("Mouse Pressed");

}

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: