Java中的內(nèi)部類內(nèi)部接口詳解

Java中的內(nèi)部類內(nèi)部接口詳解

天津卓眾教育      2022-04-24 02:28:01     17

Java中的內(nèi)部類內(nèi)部接口詳解,一般來說,我們創(chuàng)建類和接口的時(shí)候都是一個(gè)類一個(gè)文件,一個(gè)接口一個(gè)文件,但有時(shí)候?yàn)榱朔奖慊蛘吣承┨厥獾脑颍琷ava并不介意在

課程價(jià)格 請咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

一般來說,我們創(chuàng)建類和接口的時(shí)候都是一個(gè)類一個(gè)文件,一個(gè)接口一個(gè)文件,但有時(shí)候?yàn)榱朔奖慊蛘吣承┨厥獾脑颍琷ava并不介意在一個(gè)文件中寫多個(gè)類和多個(gè)接口,這就有了我們今天要講的內(nèi)部類和內(nèi)部接口。

Java內(nèi)部類

先講內(nèi)部類,內(nèi)部類就是在類中定義的類。類中的類可以看做是類的一個(gè)屬性,一個(gè)屬性可以是static也可以是非static的。而內(nèi)部類也可以定義在類的方法中,再加上匿名類,總共有5種內(nèi)部類。

靜態(tài)內(nèi)部類

我們在class內(nèi)部定義一個(gè)static的class,如下所示:

@Slf4jpublic?class?StaticInnerClass?{????static?class?Inner?{????????void?print()?{????????????log.info("Inner?class?is:?"?+?this);????????}????}????public?static?void?main(String[]?args)?{????????StaticInnerClass.Inner?inner?=?new?StaticInnerClass.Inner();????????inner.print();????}}

因?yàn)閟tatic變量可以直接根據(jù)類名來存取,所以我們使用new StaticInnerClass.Inner()來實(shí)例化內(nèi)部類。

非靜態(tài)內(nèi)部類

class中定義的類也可以是非靜態(tài)的,如下所示:

@Slf4jpublic?class?InnerClass?{?????class?Inner?{????????void?print()?{????????????log.info("Inner?class?is:?"?+?this);????????}????}????public?static?void?main(String[]?args)?{????????InnerClass.Inner?inner?=?new?InnerClass().new?Inner();????????inner.print();????}}

要訪問到類的變量,需要實(shí)例化外部內(nèi),然后再實(shí)例化內(nèi)部類:new InnerClass().new Inner()。

注意這里我們需要使用到兩個(gè)new。

靜態(tài)方法內(nèi)部類

我們可以在靜態(tài)方法中定義一個(gè)類,這個(gè)類其實(shí)就相當(dāng)于方法中的變量,這個(gè)變量當(dāng)然不能是static的。我們看下面的例子:

@Slf4jpublic?class?StaticMethodInnerClass?{????private?static?String?x?=?"static?x";????public?static?void?print()?{????????class?MyInner?{????????????public?void?printOuter()?{????????????????log.info("x?is?"?+?x);????????????}????????}????????MyInner?i?=?new?MyInner();????????i.printOuter();????}????public?static?void?main(String[]?args)?{????????StaticMethodInnerClass.print();???}}

方法中的類,我們是無法在外部實(shí)例化的。

非靜態(tài)方法的內(nèi)部類

同樣的非靜態(tài)方法也可以定義內(nèi)部類:

@Slf4jpublic?class?MethodInnerClass?{????private??String?x?=?"non?static?x";????public??void?print()?{????????class?MyInner?{????????????public?void?printOuter()?{????????????????log.info("x?is?"?+?x);????????????}????????}????????MyInner?i?=?new?MyInner();????????i.printOuter();????}????public?static?void?main(String[]?args)?{????????new?MethodInnerClass().print();????}}

注意,這里需要先實(shí)例化外部類才可以繼續(xù)調(diào)用。

匿名類

最后一個(gè),匿名類,直接在需要的時(shí)候?qū)嵗念悺D涿愇覀冇龅搅撕芏啻瘟?,比如在?gòu)建SortedSet的時(shí)候,可以傳入自定義的Comparator,我們可以用匿名類來實(shí)現(xiàn),也可以直接使用lambda表達(dá)式。

public?class?AnonymousClass?{????public?static?void?main(String[]?args)?{????????SortedSet?sortedSet1?=?new?ConcurrentSkipListSet(new?Comparator(){????????????@Override????????????public?int?compare(Object?o1,?Object?o2)?{????????????????return?0;????????????}????????});????????SortedSet?sortedSet2?=?new?ConcurrentSkipListSet((o1,?o2)?->?0);????}}

內(nèi)部接口

Inner Interface是指在接口中定義的接口。最常見的就是Map中的Entry了:

public?interface?Map?{????interface?Entry?{????????K?getKey();????}

這里的內(nèi)部接口一定是static的,因?yàn)榻涌谑遣荒軐?shí)例化的,所以為了訪問到接口中的接口,必須定義為static。如果不指定,則默認(rèn)就是static。

我們看一個(gè)該內(nèi)部接口的實(shí)現(xiàn):

public?class?MapImpl?implements?Map.Entry{????@Override????public?Object?getKey()?{????????return?0;????}????@Override????public?Object?getValue()?{????????return?null;????}????@Override????public?Object?setValue(Object?value)?{????????return?null;????}}

以上就是天津卓眾教育java培訓(xùn)機(jī)構(gòu)的小編針對“Java中的內(nèi)部類內(nèi)部接口詳解”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

培訓(xùn)啦提醒您:交易時(shí)請核實(shí)對方資質(zhì),對于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。