Java內(nèi)部類到底是什么玩意(二)

前言

自己昨天挖的坑含淚都要填完,其實(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ì)是要等工作填了)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 內(nèi)部類 分四種:成員內(nèi)部類、局部內(nèi)部類、靜態(tài)內(nèi)部類和匿名內(nèi)部類。 1、成員內(nèi)部類: 即作為外部類的一個成...
    ikaroskun閱讀 1,349評論 0 13
  • 一、介紹 內(nèi)部類是指在一個外部類的內(nèi)部再定義一個類。類名不需要和文件夾相同。內(nèi)部類可以是靜態(tài)static的,也可用...
    一只好奇的茂閱讀 1,042評論 4 21
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,637評論 18 399
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,423評論 0 2
  • 面向?qū)ο笾饕槍γ嫦蜻^程。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,220評論 0 4

友情鏈接更多精彩內(nèi)容