相关文章推荐
老实的红豆  ·  记录一次nexus私服使用npm的坑(`np ...·  1 月前    · 
买醉的野马  ·  【Python技巧】re.compile有必 ...·  1 月前    · 
满身肌肉的八宝粥  ·  【Day31】ChatGPT請教教我:Jes ...·  2 周前    · 
谦和的牙膏  ·  项目文件包含 ...·  1 年前    · 
傲视众生的鞭炮  ·  10 种保护 Spring Boot ...·  2 年前    · 
性感的炒饭  ·  连接hive查询数据时显示No ...·  2 年前    · 
英勇无比的苹果  ·  php未定义数组索引怎么解决-掘金·  2 年前    · 
坏坏的麦片  ·  python去除字符串中的空格、特殊字符和指 ...·  2 年前    · 
Code  ›  java - Java中,关于匿名内部类调用外部类方法的疑惑 -
report test
https://segmentfault.com/q/1010000009155949
紧张的香瓜
2 年前
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();
 
推荐文章
老实的红豆  ·  记录一次nexus私服使用npm的坑(`npm publish`报400、401)_npm publish 400
1 月前
买醉的野马  ·  【Python技巧】re.compile有必要吗?_python pattern必须compile吗
1 月前
满身肌肉的八宝粥  ·  【Day31】ChatGPT請教教我:Jest 單元測試(下) - 完整語法&教學 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
2 周前
谦和的牙膏  ·  项目文件包含 ToolsVersion="14.0" 设置,而此版本的 MSBuild 不支持该工具版本_此版本的msbuild不支持该工具版本-CSDN博客
1 年前
傲视众生的鞭炮  ·  10 种保护 Spring Boot 应用的绝佳方法-腾讯云开发者社区-腾讯云
2 年前
性感的炒饭  ·  连接hive查询数据时显示No module named 'sasl_mob649e8155edc4的技术博客_51CTO博客
2 年前
英勇无比的苹果  ·  php未定义数组索引怎么解决-掘金
2 年前
坏坏的麦片  ·  python去除字符串中的空格、特殊字符和指定字符的三种方法_python_脚本之家
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号