150天打卡Day23_內(nèi)部類
內(nèi)部類
內(nèi)部類即一個(gè)類中包含著另外一個(gè)類。里面的叫內(nèi)部類,外面的叫外部類
內(nèi)部類只服務(wù)于外部類,對外不具備可見性
內(nèi)部類通常只在外部類中創(chuàng)建
一共有四種內(nèi)部類,分別是成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類、靜態(tài)內(nèi)部類。
為什么需要內(nèi)部類
每個(gè)內(nèi)部類都能繼承一個(gè)接口的實(shí)現(xiàn),所以不論外部類是否繼承了某個(gè)實(shí)現(xiàn),對于內(nèi)部類沒有影響,內(nèi)部類使得多繼承變得更加完整。
定義成員內(nèi)部類
一個(gè)類可以定義在另一個(gè)類的內(nèi)部,定義在類內(nèi)部的類可以稱之為Inner,外部的類稱之為Outer;Inner類定義在Outer類的內(nèi)部,通常只服務(wù)于Outer類,不對外具備可見性。Inner類可以直接調(diào)用Outer類的成員及方法(包括私有的)。例如:
從如上代碼可以看出,可以直接從Inner類中直接調(diào)用Outer類私有變量name。
創(chuàng)建內(nèi)部類對象
一般情況下,Inner對象會(huì)在Outer對象中創(chuàng)建,Inner對象中會(huì)有一個(gè)隱式的引用指向創(chuàng)建它的Outer對象。
class YNHello { private String name="hello"; class SayHi{ public void say(){ //訪問修飾符為
實(shí)例化一個(gè)新的內(nèi)部類時(shí),需要使用外部類的實(shí)例.new的方式進(jìn)行實(shí)例化。
匿名內(nèi)部類
若想創(chuàng)建一個(gè)類的對象,并且對象只被創(chuàng)建一次,此時(shí)該類不必命名,稱之為匿名內(nèi)部類對象
也可以用lambda表達(dá)式實(shí)現(xiàn)這種方式,lambda表達(dá)式是JAVA8的新特性,也是被廣大開發(fā)者期待已久的功能。Lambda表達(dá)式支持將代碼塊作為參數(shù),允許使用更簡潔的代碼來創(chuàng)建只有一個(gè)抽象方法的接口(函數(shù)式接口)的實(shí)例。
注意事項(xiàng):在jdk1.7的版本下,匿名內(nèi)部類想訪問外部的變量,該變量必須是final的
?
面試題
內(nèi)部類有獨(dú)立的.class嗎?
?
有,每個(gè)類都會(huì)有相對應(yīng)的.class文件,$1/2這種形式的文件都是內(nèi)部類編譯后的結(jié)果
?大家記得給關(guān)阿姨點(diǎn)個(gè)關(guān)注呦
