Java的内部类
内部类的概念
内部类是定义在另一个类中的类。内部类的作用:
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据,
- 内部类可以对同一个包中的其他类隐藏起来
- 当想要定义一个回调函数且不想编写大量的代码时,使用匿名内部类比较便捷。
使用内部类访问对象的状态
public class TalkClock{
private int interval;
private boolean beep;
public TalkingClock(int interval,boolean beep){...}
public void start();
public class TimePrinter implements ActionListener
//一个内部类
{
...
}
}
在上述代码中,TimePrinter是位于TalkingClock类的内部类。但不意味着每个TalkingClock都有一个TimerPrinter实例域。TimerPrinter是有TalkingClock类的方法构造。下面是TimerPrinter的具体代码
pubic class TimePrinter implements ActionLlistener{
public void actionPerformed(ActionEvent event){
System.out.println("At eht tone,the timer is"+new Data());
if(beep)
Tookit.getDefaultTookit().beep();
}
}
在上面的代码中,TimePrinter的实例域中并没有beep这个变量。它引用的是外部类的TaikingClock对象的域。也就是说,内部类既可以访问自身的数据域,也可以访问创建他的外围类对象的数据域。
内部类的对象总有一个隐式引用,它指向了创建它的外部类对象。这个引用在内部类的定义中是不可见的。这里讲这个隐式引用成为outer。那么actionPerformed方法将等价于下列形式:
public void actionPerformed(ActionEvent event){
System.out.println("At eht tone,the time is"+new Data());
if(out.beep)
Toolkit.getDefaultTookit().beep();
}
内部类对象的构造器可以入下写
outerObject.new InnerClass(construction parameters);
ActionListener listener= this.new TimePrinter();
在上述代码中,在构造TimePrinter对象的外围类的引用被设置为创建内部类对象中方法中this引用。
内部类的声明的所有的静态域必须是final。因为我们希望一份静态域只一个实例,对于每一个外部对象,会分别有一个单独的
内部类实例。如果这个域不是fianl,它可能不是唯一。
局部内部类
如果内部类在代码中只使用一次吗,那么可以将该内部类设计成局部内部类。具体的实现方法就是在该方法中实现该类
public void start(){
class TimePrinter actionPerfoemed(ActionEvent Event){
if(beep)
...
}
局部类不能使用private,public等修饰符来进行声明,他的作用怕域被限定在声明这个局部类的块中。
匿名内部类
匿名内部类是局部内部类的更深一层次。如果只创建这个类的一个对象,那么这个类就不用命名。
public void start(int interval,boolean beep){
ActionListener listener = new ActionListener(){
System.out.println("...");
if(beep){
....
}
};
}
上述代码中,含义为创建一个实现了ActionListener接口的类的新对象,需要实现的方法actionPerformed定义在括号{}内。通常的语法格式为
new SuperTyper(construction paramters){
inner class method and data
}
由于构造器必须和类名一样,而匿名类没有名字,故而也就没有构造器。所以构造器的参数都必须传递到超类构造器中。在内部类实现接口的时候,不能有任何构造参数。普通类和匿名内部类的构造区别在于。匿名类后面会有一个;
匿名内部类常用语实现时间监听器和其他回调。
静态内部类
如果使用内部类只是想把一个类隐藏于另一个类中,并不需要内部类引用外围类对象。那么完全可以将该类定义为静态内部类。