一、内部类
使用内部类的原因:
1、内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
2、内部类可以对同一个包中的其他类隐藏起来。
3、当要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
使用内部类访问对象状态:
内部类可以用public、private、protected、default任意一个修饰。也只有内部类才能使用private修饰。
内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域,包括私有域。
import java.util.* ;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
public class Test31
{
public static void main(String[] args)
{
TalkingClock talkc = new TalkingClock(10000,true);
talkc.start();
JOptionPane.showMessageDialog(null,"Quit Programe?");
System.exit(0);
}
}
class TalkingClock
{
public TalkingClock(int interval,boolean flag)
{
this.interval = interval;
this.flag = flag;
}
public void start()
{
ActionListener actl = new TimerPrint();
Timer t = new Timer(interval,actl);
t.start();
}
private class TimerPrint implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Date now = new Date();
System.out.println("now the time is "+now);
if(flag) //此处flaa访问的是类TalkingClock的实例域。
Toolkit.getDefaultToolkit().beep();
}
}
private int interval;
private boolean flag;
}
局部内部类:
局部类不能使用public或者private访问修饰符进行声明。它的作用域就是在声明该局部类的块中
public void start()
{
class TimerPrint implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Date now = new Date();
System.out.println("now the time is "+now);
if(flag)
Toolkit.getDefaultToolkit().beep();
}
}
ActionListener actl = new TimerPrint();
Timer t = new Timer(interval,actl);
t.start();
}
匿名内部类:
所谓匿名内部类,也即只创建一次一个类的对象,连名字都不需要了。
匿名类不能有构造器,取而代之是将参数传递到父类构造器。当内部类实现接口时,不能有任何构造参数。
public void start()
{
ActionListener actl = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Date now = new Date();
System.out.println("now the time is "+now);
if(flag)
Toolkit.getDefaultToolkit().beep();
}
};
Timer t = new Timer(interval,actl);
t.start();
}
静态内部类:
当一个内部类不需要引用外围类对象时,可以将内部类声明为static。接口中的内部类,自动是static和public的。
import java.util.* ;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.event.*;
public class Test31
{
public static void main(String[] args)
{
TalkingClock talkc = new TalkingClock(10000,true);
talkc.start();
JOptionPane.showMessageDialog(null,"Quit Programe?");
System.exit(0);
}
}
class TalkingClock
{
public TalkingClock(int interval,boolean flag)
{
this.interval = interval;
this.flag = flag;
}
public static void start()
{
ActionListener actl = new TimerPrint();
Timer t = new Timer(5000,actl);
t.start();
}
private static class TimerPrint implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Date now = new Date();
System.out.println("now the time is "+now);
Toolkit.getDefaultToolkit().beep();
}
}
private int interval;
private boolean flag;
}
二、代理类有点模糊,后面搞明白再说。