package CoreJava;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.Timer;
/**
* 内部类--既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域
* 内部类--总有一个隐式引用(outerClass.this),它指向创建它的外部对象
* @author xqh
*
*/
public class InnerClassTest {
public static void main(String[] args) {
TalkingClock clock = new TalkingClock(1000, true);
clock.start();
JOptionPane.showMessageDialog(null, "Quit program?");
System.exit(0);
}
}
class TalkingClock { // outerClass
private int interval;
private boolean beep;
public TalkingClock(int interval, boolean beep) {
this.interval = interval;
this.beep = beep;
}
/*public void start() {
ActionListener listener = new TimerPrinter();
Timer t = new Timer(interval, listener);
t.start();
}*/
public void start() {
class TimerPrinter implements ActionListener { // 局部内部类--不能用public或pirvate修饰,作用域被限定在声明这个局部内部类的块中
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Date now = new Date();
System.out.println("At the tone, the time is " + now);
if (beep) // 访问outer.beep 相当于TalkingClock.this.beep
Toolkit.getDefaultToolkit().beep();
//if (TalkingClock.this.beep)
// Toolkit.getDefaultToolkit().beep();
}
}
ActionListener listener = new TimerPrinter();
Timer t = new Timer(interval, listener);
t.start();
}
/*public class TimerPrinter implements ActionListener { //innerClass
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Date now = new Date();
System.out.println("At the tone, the time is " + now);
if (beep) // 访问outer.beep 相当于TalkingClock.this.beep
Toolkit.getDefaultToolkit().beep();
//if (TalkingClock.this.beep)
// Toolkit.getDefaultToolkit().beep();
}
}*/
public void start(int interval, final boolean beep) { //匿名内部类
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Date now = new Date();
System.out.println("At the tone ,the time is " + now);
if (beep) Toolkit.getDefaultToolkit().beep();
}
};
Timer t = new Timer(interval, listener);
t.start();
}
}
示例代码--测试静态内部类:
package CoreJava;
/**
* StaticInnerClass--使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围对象。为此,可以将内部类声明为static,以便取消产生的引用
* StaticInnerClass的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
* @author xqh
*
*/
public class StaticInnerClassTest {
public static void main(String[] args) {
double[] d = new double[20];
for (int i = 0; i < d.length; i++) {
d[i] = 100 * Math.random();
}
ArrayAlg.Pair p = ArrayAlg.minmax(d);
System.out.println("min = " + p.getFirst());
System.out.println("max = " + p.getSecond());
}
}
class ArrayAlg {
public static class Pair { //StaticInnerClass--不需要访问外围类对象的时候,应该使用静态内部类
private double first;
private double second;
public double getFirst() {
return first;
}
public void setFirst(double first) {
this.first = first;
}
public double getSecond() {
return second;
}
public void setSecond(double second) {
this.second = second;
}
public Pair(double f, double s) {
first = f;
second = s;
}
}
public static Pair minmax(double[] values) {
double min = Double.MIN_VALUE;
double max = Double.MAX_VALUE;
for (double v : values) {
if (min > v) min = v;
if (max < v) max = v;
}
return new Pair(min, max);
}
}