亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

oop - Java中,關(guān)于匿名內(nèi)部類(lèi)調(diào)用外部類(lèi)方法的疑惑

瀏覽:88日期:2023-11-29 13:08:58

問(wèn)題描述

今天學(xué)習(xí)了內(nèi)部類(lèi)的知識(shí),知道內(nèi)部類(lèi)是可以持有外部類(lèi)的this,從而在內(nèi)部類(lèi)中可以使用OuterClass.this.medthod()來(lái)引用相應(yīng)外部類(lèi)方法。但是我寫(xiě)出下代碼,可以運(yùn)行,然而其中的調(diào)用邏輯我不是很明白,望賜教!

public class test {public void report(){ System.out.println('I’m invoked!');}public void perform(){ new Speaker().handleAction(new Action(){@Overridepublic void action() { report();//???為什么能調(diào)用report??} });}public static void main(String[] args) { new test().perform();//測(cè)試代碼} } class Speaker{void handleAction(Action act){ act.action();} } interface Action{void action(); }

其中設(shè)計(jì)是這樣的,test對(duì)象調(diào)用perform方法,該方法其中新建一個(gè)Speaker匿名類(lèi)對(duì)象,該對(duì)象調(diào)用了其handleAction方法,該方法的參數(shù)是一個(gè)Action接口,接口需要重寫(xiě)action抽象方法。我使用了屬于test的report方法。輸出是正常的。

那么我想知道,test對(duì)象的方法中有一個(gè)匿名類(lèi)的局部對(duì)象,局部對(duì)象參數(shù)是一個(gè)實(shí)現(xiàn)接口的匿名類(lèi),為什么在這個(gè)匿名類(lèi)中可以調(diào)用report?它持有test.this指針嗎?我理解中,new Speaker().handleAction(new Action(){....這里面的實(shí)現(xiàn)邏輯和test.this一點(diǎn)關(guān)系都沒(méi)有,也沒(méi)有必要持有test.this???

問(wèn)題解答

回答1:

public void perform(){ new Speaker().handleAction(new Action(){@Overridepublic void action() { report();//???為什么能調(diào)用report??} });}

new Speaker()不是匿名內(nèi)部類(lèi),它有確切的類(lèi)名Speakernew Action(){}是匿名內(nèi)部類(lèi),會(huì)在編譯的時(shí)候給它一個(gè)類(lèi)名(我們假定它的類(lèi)名叫Test$1,你可以打印this.getClass()看看)看出兩者的區(qū)別了嗎?匿名內(nèi)部類(lèi)多出了個(gè){}。由于new Action(){}是在test對(duì)象的作用域里被創(chuàng)建的,所以它的外部類(lèi)是Test。

匿名內(nèi)部類(lèi)也有構(gòu)造器,而且和普通類(lèi)的構(gòu)造器有點(diǎn)不一樣,編譯的時(shí)候會(huì)在匿名內(nèi)部類(lèi)的構(gòu)造器的參數(shù)列表之前再插入一個(gè)參數(shù),這個(gè)參數(shù)是外部類(lèi)的對(duì)象的引用,編譯之后這個(gè)類(lèi)長(zhǎng)這樣:

Test$1 implements Action { final T this$0; Test$1(T this$0){this.this$0 = this$0; }@Override public void action() {this$0.report(); }}

new Action(){...}實(shí)際上是創(chuàng)建了Test$1,并且通過(guò)構(gòu)造器把test對(duì)象引用傳給Test$1

public void perform(){ new Speaker().handleAction(new Test$1(this));}

所以匿名內(nèi)部類(lèi)持有外部類(lèi)的引用,且可以調(diào)用外部類(lèi)的方法

標(biāo)簽: java
主站蜘蛛池模板: 国产精品永久免费 | 福利国产 | 色吧dvd | 91影院在线观看 | 国产成人精品曰本亚洲77美色 | 国产吧在线视频 | 国产99欧美精品久久精品久久 | 中国孕妇疯狂xxxxbbbb | 一级片视频在线 | 日本欧美国产精品第一页久久 | 豆国产97在线 | 中国 | 成人一级片在线观看 | 欧美日韩一级片在线观看 | 在线视频久| 欧美一级毛片在线 | 国产v视频| 精品免费在线观看 | 国产美女操 | 成人理伦片 | 黑人巨大白妞出浆 | 高清在线一区 | 日韩中文字幕在线视频 | 模特尤妮丝凹凸福利视频 | 日本一极毛片兔费看 | 北岛玲视频在线观看 | 黄色毛片小视频 | 国产大片免费看 | 日本免费黄色小视频 | 黄色免费在线观看视频 | 国产一级二级三级视频 | 精品一区二区三区五区六区 | 特级全黄一级毛片免费 | 国产露脸无套在线观看 | 97视频免费公开成人福利 | 免费看欧美一级特黄α大片 | 5月婷婷6月丁香 | 这里只有精品首页 | 免费网站在线观看国产v片 免费网站成人亚洲 | 国产妇女性爽视频免费 | 狠狠色狠狠色综合婷婷tag | 日韩经典欧美精品一区 |