В объекте обычно внутреннего класса есть ссылка на объект внешнего класса.
Поэтому мы создаем: 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