《Java核心技术 卷I》学习笔记26:内部类


内部类是定义在另一个类中的类。使用内部类有两个原因:

  1. 内部类可以对同一个包中的其他类隐藏。
  2. 内部类方法可以访问定义这个类的作用域中的数据,包括原本私有的数据。

1 内部类的语法规则

下面展示一个内部类的实例:

public class TalkingClock
{
   
	private int interval; // 发出通知的时间间隔
	private boolean beep; // 开关铃声的标志

	public TalkingClock(int interval, boolean beep)
	{
   
		this.interval = interval;
		this.beep = beep;
	}

	public void start()
	{
   
		TimePrinter listener = new TimePrinter();
		Timer timer = new Timer(interval, listener);
		timer.start();
	}

	public class TimePrinter implements ActionListener // 内部类
	{
   
		public void actionPerformed(ActionEvent event)
		{
   
			System.out.pringln("At the tone, the time is "
				+ Instant.ofEpochMilli(event.getWhen()));
			if (beep) Toolkit.getDefaultToolkit().beep();
		}
	}
}

这里的TimePrinter类位于TalkingClock类内部,这并不意味着每个TalkingClock对象都有一个TimePrinter实例字段,TimePrinter对象是由TalkingClock类中的start方法构造的。

TimePrinter类中的actionPerformed方法使用了变量beep,这个beep变量实际上是创建TimePrinter对象的TalkingClock对象内部的字段。内部类方法可以访问自身的数据字段,也可以访问创建它的外围类对象的数据字段。为此,内部类对象有一个隐式引用,指向创建它的外围类对象。这个引用在内部类的定义中是不可见的。

外围类的引用在构造器中设置。编译器会修改所有的内部类构造器,添加一个对应外围类引用的参数。例如,上面的TimerPrinter类没有定义构造器,编译器会自动生成一个无参数构造器,并添加一个外围类TalkingClock类型的参数,代码如下:

public TimePrinter(TalkingClock clock)
{
   
	TalkingClock.this = clock;
}

内部类中对外围类引用的调用是隐式的,可以通过外围类名.this显式调用。例如上面的TalkingClock.this就是对外围类引用的显式调用。为了明显区分内部类自身的字段和外围类的字段,可以在内部类方法中显式使用外围类引用。例如&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值