相关文章推荐
重感情的熊猫  ·  从一个 ...·  4 月前    · 
兴奋的玉米  ·  Fixing 'A Facade Root ...·  3 月前    · 
没读研的匕首  ·  Spring @Value ...·  2 月前    · 
呐喊的打火机  ·  Handling auto_now and ...·  2 月前    · 
年轻有为的烤地瓜  ·  文档编辑 | Seven的菜鸟成长之路·  2 月前    · 
阳刚的紫菜汤  ·  “悍妇”邓文迪:嫁百亿豪门,出轨英国首相,离 ...·  1 年前    · 
月球上的西红柿  ·  天猫国际出台招商新政:四种模式入驻,新商家保 ...·  1 年前    · 
玩足球的爆米花  ·  光模块狂飙|上海证券报·  1 年前    · 
性感的凉面  ·  长城汽车围绕数据一元化及53211战略打造长 ...·  2 年前    · 
睿智的跑步鞋  ·  精灵梦叶罗丽漫画卡片_精灵梦叶罗丽第十季漫画 ...·  3 年前    · 
Code  ›  java - Java中,关于匿名内部类调用外部类方法的疑惑 -
report test
https://segmentfault.com/q/1010000009155949
紧张的香瓜
3 年前
segmentfault segmentfault
注册登录
问答 博客 标签 活动
发现
✓ 使用“Bing”搜本站 使用“Google”搜本站 使用“百度”搜本站 站内搜索
注册登录
  1. 首页
  2. 问答
  3. java
  4. 问答详情

Java中,关于匿名内部类调用外部类方法的疑惑

头像
Azure_Chien
97 2 16 28
发布于
2017-04-22

今天学习了内部类的知识,知道内部类是可以持有外部类的this,从而在内部类中可以使用OuterClass.this.medthod()来引用相应外部类方法。但是我写出下代码,可以运行,然而其中的调用逻辑我不是很明白,望赐教!

public class test {
        public void report(){
            System.out.println("I'm invoked!");
        public void perform(){
            new Speaker().handleAction(new Action(){
                @Override
                public void action() {
                    report();//???为什么能调用report??
        public static void main(String[] args) {
            new test().perform();//测试代码
    class Speaker{
        void handleAction(Action act){
            act.action();
    interface Action{
        void action();

其中设计是这样的,test对象调用perform方法,该方法其中新建一个Speaker匿名类对象,该对象调用了其handleAction方法,该方法的参数是一个Action接口,接口需要重写action抽象方法。我使用了属于test的report方法。输出是正常的。

那么我想知道,test对象的方法中有一个匿名类的局部对象,局部对象参数是一个实现接口的匿名类,为什么在这个匿名类中可以调用report?它持有test.this指针吗?
我理解中,new Speaker().handleAction(new Action(){....这里面的实现逻辑和test.this一点关系都没有,也没有必要持有test.this???

java 面向对象设计模式 面向对象编程 oop
阅读 8.1k
1 个回答
得票 最新
头像
bassda
326 10
发布于
2017-04-22
✓ 已被采纳
        public void perform(){
            new Speaker().handleAction(new Action(){
                @Override
                public void action() {
                    report();//???为什么能调用report??

new Speaker()不是匿名内部类,它有确切的类名Speaker
new Action(){}是匿名内部类,会在编译的时候给它一个类名(我们假定它的类名叫Test$1,你可以打印this.getClass()看看)
看出两者的区别了吗?匿名内部类多出了个{}。
由于new Action(){}是在test对象的作用域里被创建的,所以它的外部类是Test。

匿名内部类也有构造器,而且和普通类的构造器有点不一样,编译的时候会在匿名内部类的构造器的参数列表之前再插入一个参数,这个参数是外部类的对象的引用,编译之后这个类长这样:

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();
 
推荐文章
重感情的熊猫  ·  从一个 NullPointerException 探究 Java 的自动装箱拆箱机制 — 码志
4 月前
兴奋的玉米  ·  Fixing 'A Facade Root Has Not Been Set' when testing Laravel with Pest - Paul Conroy
3 月前
没读研的匕首  ·  Spring @Value Annotation - A Comprehensive Guide
2 月前
呐喊的打火机  ·  Handling auto_now and auto_now_add with factory_boy
2 月前
年轻有为的烤地瓜  ·  文档编辑 | Seven的菜鸟成长之路
2 月前
阳刚的紫菜汤  ·  “悍妇”邓文迪:嫁百亿豪门,出轨英国首相,离婚7年分前夫268亿_默多克_财产_婚姻
1 年前
月球上的西红柿  ·  天猫国际出台招商新政:四种模式入驻,新商家保证金减50%_资讯_观潮新消费
1 年前
玩足球的爆米花  ·  光模块狂飙|上海证券报
1 年前
性感的凉面  ·  长城汽车围绕数据一元化及53211战略打造长城智能云_搜狐汽车_搜狐网
2 年前
睿智的跑步鞋  ·  精灵梦叶罗丽漫画卡片_精灵梦叶罗丽第十季漫画在哪里看_精灵梦叶罗丽卡通画 - 抖音
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号