(十)、java内部类与内部类的闭包和回调
一、成員內(nèi)部類
1.可以把一個(gè)內(nèi)部類看做是一個(gè)成員。成員內(nèi)部類可以無條件訪問外部類的所有成員屬性和成員方法。
class OutterClass {//外部類private int in = 0;static int inn=4;public OutterClass(int in) {this.in = in;}class InnerClass { //內(nèi)部類public void output() {System.out.println(in);System.out.println(inn);}} }?
2.當(dāng)成員內(nèi)部類擁有和外部類同名的成員變量或者方法時(shí),默認(rèn)情況下訪問的是成員內(nèi)部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進(jìn)行訪問。
OutterClass(外部類).this.成員?
3.外部類訪問內(nèi)部類,必須創(chuàng)建一個(gè)成員內(nèi)部類的對(duì)象,再通過指向這個(gè)對(duì)象的引用來訪問。
class OutterClass {private int in = 0;static int inn=4;public OutterClass(int in) {InnerClass inner=new InnerClass(); //創(chuàng)建一個(gè)成員內(nèi)部類的對(duì)象this.in=inner.innerNum; //再通過指向這個(gè)對(duì)象的引用來訪問}class InnerClass { //內(nèi)部類public int innerNum=1;public void output() {System.out.println(in);System.out.println(inn);int a=OutterClass.this.inn;}} }?
4.成員內(nèi)部類是依附于外部類而存在的。也就是說,如果要?jiǎng)?chuàng)建成員內(nèi)部類的對(duì)象,前提是必須存在一個(gè)外部類的對(duì)象。
創(chuàng)建成員內(nèi)部類的一般方式為:
public class classa {public static void main(){OutterClass oc=new OutterClass(3);OutterClass.InnerClass in=oc.new InnerClass();} }?
二、局部?jī)?nèi)部類
局部?jī)?nèi)部類就像是方法里面的一個(gè)局部變量一樣,是不能有public、protected、private以及static修飾的。
class OutterClass{public OutterClass(int in){class InnerClass{int innerNum = 1;}} }?
規(guī)則一:局部?jī)?nèi)部類類似方法的局部變量,所以在類外或者類的其他方法中不能訪問這個(gè)內(nèi)部類,但這并不代表局部?jī)?nèi)部類的實(shí)例和定義了它的方法中的局部變量具有相同的生命周期。
規(guī)則二:只能在方法內(nèi)部,類(局部?jī)?nèi)部類)定義之后使用,不存在外部可見性問題,因此沒有訪問修飾符。
規(guī)則三:不能在局部?jī)?nèi)部類中使用可變的局部變量。
規(guī)則四:可以訪問外圍類的成員變量。如果是static方法,則只能訪問static修飾的成員變量。
規(guī)則五:可以使用final 或 abstract修飾。
?
三、靜態(tài)內(nèi)部類
又叫靜態(tài)嵌套類或嵌套類。是使用static關(guān)鍵字修飾的內(nèi)部類。
一般形式為
public class Outter {/** 嵌套類,public等四種訪問修飾符均可修飾*/public static class Inner {/** 嵌套類內(nèi)部*/} }接口中的形式
public interface OutInterface {/** 嵌套類,在接口中定義的任何類都自動(dòng)的是public和static的,因此這兩個(gè)關(guān)鍵字都可以省略*/class Inner {public void print() {System.out.println("print()");}} }聲明為static的內(nèi)部類,不需要內(nèi)部類對(duì)象和外部類對(duì)象之間的聯(lián)系,就是說我們可以直接引用outer.inner,即不需要?jiǎng)?chuàng)建外部類,也不需要?jiǎng)?chuàng)建內(nèi)部類。
public class classa {public static void main(){Outter.Inner in=new Outter.Inner();} }?
規(guī)則一:不能從嵌套類中訪問外部類的非靜態(tài)成員。這一點(diǎn)與Java基礎(chǔ)語法中對(duì)靜態(tài)非靜態(tài)語法的相關(guān)描述完全一致。
規(guī)則二:與普通內(nèi)部類不同,嵌套類實(shí)例化不需要依賴外部類對(duì)象,與外部類沒有必然聯(lián)系。
規(guī)則三:與普通內(nèi)部類的區(qū)別如下:
普通內(nèi)部類只能包含非靜態(tài)變量、非靜態(tài)方法、非嵌套類。
靜態(tài)嵌套類可以包含靜態(tài)和非靜態(tài)變量、靜態(tài)和非靜態(tài)方法、靜態(tài)和普通內(nèi)部類。
規(guī)則四:嵌套類可以定義在接口中,并作為接口的一部分來使用。
實(shí)例:
/** 接口*/ public interface OutInterface {void method_1();void method_2();/** 嵌套類*/class Inner {public void print() {System.out.println("print something...");}} }/** 實(shí)現(xiàn)類 */ public class OutInterfaceImpl implements OutInterface {private OutInterface.Inner inner = new Inner();@Overridepublic void method_1() {inner.print();}@Overridepublic void method_2() {inner.print();}public static void main(String[] args) {OutInterface oif = new OutInterfaceImpl();oif.method_1();oif.method_2();} }?
四、匿名內(nèi)部類
由于匿名內(nèi)部類不利于代碼的重用,因此,一般在確定此內(nèi)部類只會(huì)使用一次時(shí),才會(huì)使用匿名內(nèi)部類。
形式:
public class OutterClass {public Runnable task() {return new Runnable() {@Overridepublic void run() {System.out.println("匿名內(nèi)部類...");}};} }?
五、閉包和回調(diào)
閉包(Closure)是一種能被調(diào)用的對(duì)象,它保存了創(chuàng)建它的作用域的信息。JAVA并不能顯式地支持閉包,但是在JAVA中,閉包可以通過“接口+內(nèi)部類”來實(shí)現(xiàn)。
例如:一個(gè)接口程序員和一個(gè)基類作家都有一個(gè)相同的方法work,相同的方法名,但是其含義完全不同,這時(shí)候就需要閉包。
閉包實(shí)現(xiàn)代碼如下:
public class WriterProgrammer extends Writer {@Overridepublic void work(){//寫作 }public void code(){//寫代碼 }class ProgrammerInner implements programmer{@Overridepublic void work(){code();}} }在子類中定義了遵循程序員接口規(guī)則的內(nèi)部類,然后使用內(nèi)部類實(shí)現(xiàn)程序員的work()方法回調(diào)code()方法,在子類中直接實(shí)現(xiàn)父類作家的work()方法。
?
六、內(nèi)部類的作用
- 內(nèi)部類可以很好的實(shí)現(xiàn)隱藏。
一般的非內(nèi)部類,是不允許有 private 與protected權(quán)限的,但內(nèi)部類可以 - 內(nèi)部類擁有外圍類的所有元素的訪問權(quán)限
- 可是實(shí)現(xiàn)多重繼承
- 可以避免修改接口而實(shí)現(xiàn)同一個(gè)類中兩種同名方法的調(diào)用。
?
參考1:https://www.jianshu.com/p/367b138fe909
參考2:https://blog.csdn.net/u014745069/article/details/80201440
轉(zhuǎn)載于:https://www.cnblogs.com/lixiansheng/p/11299765.html
總結(jié)
以上是生活随笔為你收集整理的(十)、java内部类与内部类的闭包和回调的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea命令行运行多个客户端_推荐一款神
- 下一篇: 幽默:程序员10大口头禅,你都听过吗?