前言
自己昨天挖的坑含淚都要填完,其實(shí)昨天自認(rèn)為內(nèi)部類講的還不夠透徹,因?yàn)橹皇钦f并沒有拿出任何證據(jù)說明內(nèi)部類持有了外部類的引用,還有私有變量是怎么獲取的,這得怪我本身能力不夠,javap的反編譯信息看不懂,周末抽空讓我把底層的大坑都補(bǔ)上吧。
正文
今天我們來講局部內(nèi)部類,匿名內(nèi)部類和靜態(tài)內(nèi)部類。局部內(nèi)部類聲明在方法體內(nèi)它能看得見外面卻不能被方法體外面的東西看見,而且他的修飾符不能為public和private因?yàn)樗会槍Ψ椒梢?。最重要的一點(diǎn)就是它引用局部變量必須為final看例子(昨天的例子)
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.Timer;
public class TestInnerClass2 {
public static void main(String[] args) {
TimerClock2 clock = new TimerClock2(true);
clock.start(false);
}
}
class TimerClock2 {
private boolean isClocked = false;
public TimerClock2(boolean isClocked) {
this.isClocked = isClocked;
}
public void start(final boolean isClocked) {
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ā)出鈴聲
}
}
}
ActionListener listener = new TimerPrinter();
Timer t = new Timer(1000, listener);// 定時器
t.start();
}
}
為什么要聲明為final因?yàn)閟tart方法結(jié)束后isClocked是不存在的,那么聲明final變量就是為了拷貝一份到內(nèi)部類自身的域里面,這樣就解決兩者聲明周期不一致的問題。
匿名內(nèi)部類so easy就是在父類或者接口擴(kuò)展其功能的具體實(shí)現(xiàn)類或者子類,因?yàn)槠浔旧硎菦]有類名的所以其沒有構(gòu)造函數(shù),而交給父類構(gòu)造器解決(接口就沒構(gòu)造參數(shù)這一說法了)
public void start(final boolean isClocked) {
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!isClocked) {
Date date = new Date();
System.out.println(date);
} else {
Toolkit.getDefaultToolkit().beep();// 會發(fā)出鈴聲
}
}
};
Timer t = new Timer(1000, listener);// 定時器
t.start();
}
當(dāng)然這玩意淫蕩的地方不在這,有種我根本沒見過的方式
new ArrayList() {{add(1);add(2);add(3);}};
它運(yùn)用了匿名內(nèi)部類和實(shí)例初始化域(在構(gòu)造器super()之后調(diào)用)
最后靜態(tài)內(nèi)部類用的不多,它就是獨(dú)立于外部類,卻又只被外部類使用,而并不是依賴外部類new出的對象具體就是直接Outer.Inner inner = new Outer.Inner ()。(不過我還沒想好內(nèi)部類的使用場景,這個坑估計(jì)是要等工作填了)