詳細(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)注腳本之家其它相關(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中的getClass()以及getName()方法使用
這篇文章主要介紹了Java中的getClass()以及getName()方法使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringMVC @GetMapping注解路徑?jīng)_突問(wèn)題解決
MD5對(duì)密碼進(jìn)行加密存儲(chǔ)是常見(jiàn)的一種加密方式,本文主要介紹了Java雙重MD5加密實(shí)現(xiàn)安全登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
java UUID&雪花算法生成和使用場(chǎng)景詳解
UUID和雪花算法都是用于生成唯一標(biāo)識(shí)符的有效工具,它們各有優(yōu)勢(shì):UUID簡(jiǎn)單易用,但長(zhǎng)度較長(zhǎng),適用于分布式系統(tǒng);雪花算法生成的ID較短且有序,適用于需要保證順序的場(chǎng)景,在選擇算法時(shí),需要考慮系統(tǒng)架構(gòu)、性能需求和順序需求等因素2025-01-01
Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐
在某些特定的業(yè)務(wù)場(chǎng)景下,會(huì)需要使用自增的序列來(lái)維護(hù)數(shù)據(jù),本文主要介紹了Springboot MongoDB實(shí)現(xiàn)自增序列的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java使用easyExcel實(shí)現(xiàn)導(dǎo)入功能
這篇文章介紹了Java使用easyExcel實(shí)現(xiàn)導(dǎo)入功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
java 學(xué)習(xí)筆記(入門(mén)篇)_java的安裝與配置
學(xué)習(xí)Java已經(jīng)很長(zhǎng)時(shí)間了,由于基礎(chǔ)不好遇到問(wèn)題就無(wú)從下手,所以,打算寫(xiě)Java的隨手筆記來(lái)鞏固基礎(chǔ),加強(qiáng)學(xué)習(xí),接下來(lái)講解java的安裝,配置等,感興趣的朋友可以參考下2013-01-01

