Статические внутренние классы (nested)

В объекте обычно внутреннего класса есть ссылка на объект внешнего класса.

Поэтому мы создаем: obj.newInner();

У статического такой ссылки нет.

Поэтому:

- для его создания не нужен объект внешнего класса.

- из объекта статического внутреннего класса нельзя обращаться к нестатическим членам внешнего (а только к статическим).

- у нестатических внешних классов не может быть статических членов. У статических – могут.

class Outer2 {

static class Inner2{}

public static Inner2 createInner() { return new Inner2(); }

}

Извне

Outer2.Inner2 obj1 = new Outer2.Inner2;//похоже на пакет

Outer2.Inner2 obj2 = new Outer2.createInner();// порождение через метод

Пример: в библиотеке Java2D есть класс Rectangle2D – абстрактный. В нем есть 2 конкретных подкласса:

- внутренние статические;

- наследники внешнего.

Rectangle 2D.Float

Rectangle 2D.Double

Создание:

Rectangle2D.Double d = new Rectangle2D.Double (10.0, 25.0, 22.5, 20.0);

А можно сделать upcasting

Rectangle2D d = new Rectangle2D.Double (10.0, 25.0, 22.5, 20.0);

Пример применения внутренних классов: говорящие часы:

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

import javax.swing.Timer;

class TalkingClock{

private int interval;

private boolean beep;

public TalkingClock (int interval, boolean beep){

this.interval = interval;

this.beep = beep;

}

_________________________________________________________________________

private class TimePrinter implements ActionListener {

public void actionPerformed (ActionEvent event) {

Date now = new Date ();

System.out.println (“The time is ” + now);

if (beep) Toolkit.getDefaultToolkit().beep();

}

}

________________________________________________________________________

public void go (){

ActionListener listener = new TimePrinter ();

Timer t = new Timer (interval, listener);

t.start ();

}

}

________________________________________________________________

public class TalkingClockTest {

public static void main (String [] args) {

TalkingClock clock = new TalkingClock (200, true);

clock.go ();

JoptionPane.showMessageDialog (null, “Quit?”);

System.exit (0);

}

}

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

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

import javax.swing.Timer;

class TalkinClock {

public void go(int interval, final boolean beep){

ActionListener listener = new

ActionListener(){

public void ActionPerformed(ActionEvent event) {

Date now = new Date();

System.out.println(“The time is” + now);

if (beep) Tookit.getDefaultToolkit().beep();

}

};

Timer t = new Timer(interval, listener);

t.start;

}//go()

}

public class AnonymusTalkingClockTest {

public static void main (String [] args) {

TalkingClock clock = new TalkingClock();

clock.go (1000, true);

JoptionPane.showMessageDialog(null, “Quit?”);

System.exit (0);

}

}

Тема 11


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



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