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
	}

由于构造器必须和类名一样,而匿名类没有名字,故而也就没有构造器。所以构造器的参数都必须传递到超类构造器中。在内部类实现接口的时候,不能有任何构造参数。普通类和匿名内部类的构造区别在于。匿名类后面会有一个;
匿名内部类常用语实现时间监听器和其他回调。

静态内部类

如果使用内部类只是想把一个类隐藏于另一个类中,并不需要内部类引用外围类对象。那么完全可以将该类定义为静态内部类。

posted @ 2019-01-05 17:39  __NaCl  阅读(255)  评论(0编辑  收藏  举报