日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(十)、java内部类与内部类的闭包和回调

發(fā)布時(shí)間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (十)、java内部类与内部类的闭包和回调 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、成員內(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í)候就需要閉包。

class Writer {//作家基類void work(){}; } interface programmer{//程序員接口void work(); }

閉包實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。