Java内部类到底是什么玩意(一)
2017-05-16 本文已影响0人
赵志文学编程
前言
最近为了复习基础学的东西比较杂,翻看Core Java了,看到内部类这一块感觉理解的和以前不一样。
正文
为了做示例可能会用java GUI来说明更加合适,当然书上也是拿这个例子来做解释的
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.Timer;
public class TestInnerClass {
public static void main(String[] args) {
TimerClock clock = new TimerClock(true);
clock.start();
}
}
class TimerClock {
private boolean isClocked = false;
public TimerClock(boolean isClocked) {
this.isClocked = isClocked;
}
public void start() {
ActionListener listener = this.new TimerPrinter();
Timer t = new Timer(1000, listener);//定时器
t.start();
}
private class TimerPrinter implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(!isClocked) {
Date date = new Date();
System.out.println(date);
}else {
Toolkit.getDefaultToolkit().beep();//会发出铃声
}
}
}
}
为什么内部类可以访问外部类的私有变量,我们可以单独拎出来看,一开始我以为就是内部类持有一个外部类的引用也就是内部默认自动生成有
private TimerClock outer;
public TimerPrinter(TimerClock clock) {
outer = clock;
}
然后下面的调用就是outer.isClock(其实不是这样传的,不过机制是可以这么理解,后面会讲到)那么外部类实际上生成的是TimerClock.this.isClock(区别内部类的this)
问题又来了凭什么能够访问isClock变量,它不是私有的吗,按照常理理解它在内部当然能访问外部变量了,但是实际上可能不是这样的在外部类多了这么一行代码
static boolean access$0(TimerClock clock) //返回beep值
然后内部调用时调用access$0(outer)(方法名字可能变化,outer方便看懂);
明天稍微讲一下局部内部类和匿名内部类