前言
最近為了復(fù)習(xí)基礎(chǔ)學(xué)的東西比較雜,翻看Core Java了,看到內(nèi)部類這一塊感覺理解的和以前不一樣。
正文
為了做示例可能會用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();//會發(fā)出鈴聲
}
}
}
}
為什么內(nèi)部類可以訪問外部類的私有變量,我們可以單獨拎出來看,一開始我以為就是內(nèi)部類持有一個外部類的引用也就是內(nèi)部默認自動生成有
private TimerClock outer;
public TimerPrinter(TimerClock clock) {
outer = clock;
}
然后下面的調(diào)用就是outer.isClock(其實不是這樣傳的,不過機制是可以這么理解,后面會講到)那么外部類實際上生成的是TimerClock.this.isClock(區(qū)別內(nèi)部類的this)
問題又來了憑什么能夠訪問isClock變量,它不是私有的嗎,按照常理理解它在內(nèi)部當然能訪問外部變量了,但是實際上可能不是這樣的在外部類多了這么一行代碼
static boolean access$0(TimerClock clock) //返回beep值
然后內(nèi)部調(diào)用時調(diào)用access$0(outer)(方法名字可能變化,outer方便看懂);
明天稍微講一下局部內(nèi)部類和匿名內(nèi)部類