詳細(xì)分析Java內(nèi)部類(lèi)——局部?jī)?nèi)部類(lèi)
今天介紹第二種內(nèi)部類(lèi)——局部?jī)?nèi)部類(lèi)。
局部?jī)?nèi)部類(lèi)是什么?顧名思義,那就是定義在局部?jī)?nèi)部的類(lèi)(逃)。開(kāi)玩笑的,局部?jī)?nèi)部類(lèi)就是定義在代碼塊、方法體內(nèi)、作用域(使用花括號(hào)“{}”括起來(lái)的一段代碼)內(nèi)的類(lèi)。局部?jī)?nèi)部類(lèi)有以下特性:
- 局部?jī)?nèi)部類(lèi)只能在代碼代碼塊、方法體內(nèi)和作用域中使用。
- 局部?jī)?nèi)部類(lèi)同樣可以無(wú)限制調(diào)用外部類(lèi)的方法和屬性。
- 可以使用abstract修飾,聲明為抽象類(lèi)。
舉個(gè)栗子:
public class Outer2 { public void print(){ class Inner2{ public void test(){ System.out.println("Inner.print()"); } } Inner2 inner2 = new Inner2(); inner2.test(); } }
public class Test { public static void main(String[] args) { Outer2 outer2 = new Outer2(); outer2.print(); } }
這里的Inner2類(lèi)僅僅在Outer2的print方法中被使用,有效范圍也僅在print函數(shù)之內(nèi)。
通過(guò)這段玩具代碼,可能無(wú)法理解為什么java中要出現(xiàn)這樣限制這么多而且挺復(fù)雜的東西。讓我們來(lái)看看之前的栗子:Java中的回調(diào)
這里把代碼復(fù)制過(guò)來(lái):
public class TimePrinter implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Date now = new Date(); System.out.println("Time is " + now + " now."); } }
public class Test { public static void main(String[] args) { ActionListener listener = new TimePrinter(); Timer t = new Timer(1000,listener); t.start(); JOptionPane.showMessageDialog(null,"Quit program?");//彈出對(duì)話框,防止主線程結(jié)束導(dǎo)致時(shí)鐘結(jié)束 System.exit(0); } }
在這里,我們想要?jiǎng)?chuàng)建一個(gè)Timer時(shí),需要往里面?zhèn)魅胍粋€(gè)實(shí)現(xiàn)了ActionListener接口的對(duì)象,而這個(gè)對(duì)象僅僅在該方法中使用了一次,這時(shí)候內(nèi)部類(lèi)的優(yōu)勢(shì)就體現(xiàn)出來(lái)了,把類(lèi)封裝在方法中,不向外界提供任何冗余信息:
public class Test { public static void main(String[] args) { class InnerTimePrinter implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Date now = new Date(); System.out.println("Time is " + now + " now."); } } ActionListener listener = new InnerTimePrinter(); Timer t = new Timer(1000,listener); t.start(); JOptionPane.showMessageDialog(null,"Quit?"); System.exit(0); } }
你也許會(huì)覺(jué)得,這樣好像只是把類(lèi)簡(jiǎn)單的挪到了另一個(gè)類(lèi)里面,并沒(méi)有什么luan用。
表面上,確實(shí)如此,但事實(shí)上,還是有很多l(xiāng)uan用的。
在《Think in java》中有這樣一句話:使用內(nèi)部類(lèi)最吸引人的原因是:每個(gè)內(nèi)部類(lèi)都能獨(dú)立地繼承一個(gè)(接口的)實(shí)現(xiàn),所以無(wú)論外圍類(lèi)是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類(lèi)都沒(méi)有影響。
我們都知道,java中是不能實(shí)現(xiàn)多繼承的,接口也正是為了對(duì)多繼承的補(bǔ)充完善給出的方案。而我們程序設(shè)計(jì)中有時(shí)候會(huì)存在一些使用接口很難解決的問(wèn)題,這個(gè)時(shí)候我們可以利用內(nèi)部類(lèi)提供的、可以繼承多個(gè)具體的或者抽象的類(lèi)的能力來(lái)解決這些程序設(shè)計(jì)問(wèn)題??梢哉f(shuō),接口只是解決了部分問(wèn)題,而內(nèi)部類(lèi)使得多重繼承的解決方案變得更加完整。
據(jù)個(gè)人經(jīng)驗(yàn),局部?jī)?nèi)部類(lèi)確實(shí)用的不多,但不常用不代表沒(méi)有用,知道有這樣一個(gè)神奇的內(nèi)部類(lèi)存在,了解過(guò)它的特性之后,可以為你日后的需求提供更多的方案。
至此,本篇講解完畢,歡迎大家繼續(xù)關(guān)注!
以上就是詳細(xì)分析Java內(nèi)部類(lèi)——局部?jī)?nèi)部類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于Java 局部?jī)?nèi)部類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java中的內(nèi)部類(lèi)內(nèi)部接口用法說(shuō)明
- Java匿名內(nèi)部類(lèi)的寫(xiě)法示例
- 淺談Java內(nèi)部類(lèi)——靜態(tài)內(nèi)部類(lèi)
- 淺析Java內(nèi)部類(lèi)——成員內(nèi)部類(lèi)
- 詳解Java內(nèi)部類(lèi)——匿名內(nèi)部類(lèi)
- Java內(nèi)部類(lèi)和匿名內(nèi)部類(lèi)的用法說(shuō)明
- JAVA匿名內(nèi)部類(lèi)語(yǔ)法分析及實(shí)例詳解
- Java匿名類(lèi),匿名內(nèi)部類(lèi)實(shí)例分析
- Java內(nèi)部類(lèi)的實(shí)現(xiàn)原理與可能的內(nèi)存泄漏說(shuō)明
相關(guān)文章
java輸出1~100之間的全部素?cái)?shù)的5種方式總結(jié)
這篇文章主要介紹了java輸出1~100之間的全部素?cái)?shù)的5種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java并發(fā)編程之關(guān)鍵字volatile的深入解析
提高java的并發(fā)編程,就不得不提volatile關(guān)鍵字,不管是在面試還是實(shí)際開(kāi)發(fā)中volatile都是一個(gè)應(yīng)該掌握的技能,這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程之關(guān)鍵字volatile的相關(guān)資料,需要的朋友可以參考下2021-09-09IDEA中用maven連接數(shù)據(jù)庫(kù)的教程
這篇文章主要介紹了IDEA中用maven連接數(shù)據(jù)庫(kù)的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn)
本文主要介紹了SpringBoot?AOP?Redis實(shí)現(xiàn)延時(shí)雙刪功能實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Java橋接模式實(shí)例詳解【簡(jiǎn)單版與升級(jí)版】
這篇文章主要介紹了Java橋接模式,結(jié)合實(shí)例形式分析了java橋接模式簡(jiǎn)單版與升級(jí)版兩種實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-07-07Java封裝數(shù)組之動(dòng)態(tài)數(shù)組實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java封裝數(shù)組之動(dòng)態(tài)數(shù)組實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了java動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)原理、操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-03-03Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法
這篇文章主要介紹了Java讀取Oracle大字段數(shù)據(jù)(CLOB)的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04