詳細(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)題。可以說(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)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說(shuō)明2. PHP設(shè)計(jì)模式中工廠模式深入詳解3. CSS hack用法案例詳解4. ThinkPHP5實(shí)現(xiàn)JWT Token認(rèn)證的過(guò)程(親測(cè)可用)5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. asp中response.write("中文")或者js中文亂碼問(wèn)題7. .NET中l(wèi)ambda表達(dá)式合并問(wèn)題及解決方法8. PHP session反序列化漏洞超詳細(xì)講解9. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向10. ASP+ajax實(shí)現(xiàn)頂一下、踩一下同支持與反對(duì)的實(shí)現(xiàn)代碼
