詳細(xì)分析Java內(nèi)部類——局部?jī)?nèi)部類
今天介紹第二種內(nèi)部類——局部?jī)?nèi)部類。
局部?jī)?nèi)部類是什么?顧名思義,那就是定義在局部?jī)?nèi)部的類(逃)。開玩笑的,局部?jī)?nèi)部類就是定義在代碼塊、方法體內(nèi)、作用域(使用花括號(hào)“{}”括起來(lái)的一段代碼)內(nèi)的類。局部?jī)?nèi)部類有以下特性:
- 局部?jī)?nèi)部類只能在代碼代碼塊、方法體內(nèi)和作用域中使用。
- 局部?jī)?nèi)部類同樣可以無(wú)限制調(diào)用外部類的方法和屬性。
- 可以使用abstract修飾,聲明為抽象類。
舉個(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類僅僅在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)部類的優(yōu)勢(shì)就體現(xiàn)出來(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ì)覺得,這樣好像只是把類簡(jiǎn)單的挪到了另一個(gè)類里面,并沒(méi)有什么luan用。
表面上,確實(shí)如此,但事實(shí)上,還是有很多l(xiāng)uan用的。
在《Think in java》中有這樣一句話:使用內(nèi)部類最吸引人的原因是:每個(gè)內(nèi)部類都能獨(dú)立地繼承一個(gè)(接口的)實(shí)現(xiàn),所以無(wú)論外圍類是否已經(jīng)繼承了某個(gè)(接口的)實(shí)現(xiàn),對(duì)于內(nèi)部類都沒(méi)有影響。
我們都知道,java中是不能實(shí)現(xiàn)多繼承的,接口也正是為了對(duì)多繼承的補(bǔ)充完善給出的方案。而我們程序設(shè)計(jì)中有時(shí)候會(huì)存在一些使用接口很難解決的問(wèn)題,這個(gè)時(shí)候我們可以利用內(nèi)部類提供的、可以繼承多個(gè)具體的或者抽象的類的能力來(lái)解決這些程序設(shè)計(jì)問(wèn)題??梢哉f(shuō),接口只是解決了部分問(wèn)題,而內(nèi)部類使得多重繼承的解決方案變得更加完整。
據(jù)個(gè)人經(jīng)驗(yàn),局部?jī)?nèi)部類確實(shí)用的不多,但不常用不代表沒(méi)有用,知道有這樣一個(gè)神奇的內(nèi)部類存在,了解過(guò)它的特性之后,可以為你日后的需求提供更多的方案。
至此,本篇講解完畢,歡迎大家繼續(xù)關(guān)注!
以上就是詳細(xì)分析Java內(nèi)部類——局部?jī)?nèi)部類的詳細(xì)內(nèi)容,更多關(guān)于Java 局部?jī)?nèi)部類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(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ǔ)是常見的一種加密方式,本文主要介紹了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í)筆記(入門篇)_java的安裝與配置
學(xué)習(xí)Java已經(jīng)很長(zhǎng)時(shí)間了,由于基礎(chǔ)不好遇到問(wèn)題就無(wú)從下手,所以,打算寫Java的隨手筆記來(lái)鞏固基礎(chǔ),加強(qiáng)學(xué)習(xí),接下來(lái)講解java的安裝,配置等,感興趣的朋友可以參考下2013-01-01

