• 内部类访问外部类的方法


      作为一个工作了8年的程序员,内部类也用过,但是内部类访问外部类在看源码的时候都很少看到了,震惊之余也感叹自己的技术不行啊

      一 起因

      突然想起来自己在中兴的时候做SDN,当时是自己写netty定时往网元发送心跳。突然就想到了当时用的是Jdk的  ScheduledThreadPoolExecutor 

      也是心血来潮就想着看看源码吧

      实现定时的逻辑在  ScheduledFutureTask.run() 

      

    public void run() {
                boolean periodic = isPeriodic();
                if (!canRunInCurrentRunState(periodic))
                    cancel(false);
                else if (!periodic)
                    ScheduledFutureTask.super.run();
                else if (ScheduledFutureTask.super.runAndReset()) {
                    setNextRunTime();
                    reExecutePeriodic(outerTask);
                }
            }

      注意了,这个 方法  reExecutePeriodic 是定义在   ScheduledThreadPoolExecutor  中的,而ScheduledFutureTask是 定义在 ScheduledThreadPoolExecutor 中的内部类。看到这里我懵了

      内部类的方法里直接访问外部类的方法??貌似我之前都没有注意过。

    void reExecutePeriodic(RunnableScheduledFuture<?> task) {
            if (canRunInCurrentRunState(true)) {
                super.getQueue().add(task);
                if (!canRunInCurrentRunState(true) && remove(task))
                    task.cancel(false);
                else
                    ensurePrestart();
            }
        }

    二 验证

      利用工具我们就验证下

      代码如下 。在项目工程下产生两个文件 Person.class, Person$InnerClass.class

    public class Person {
        
        private class InnerClass {
            
        }

      执行javap结果如下

      

      能看到内部类中持有一个外部类类型的成员变量,这就说的通了可以直接访问外部类的方法了

  • 相关阅读:
    Windows10下Opencv4+CMake+MinGW64+VSC安装教程
    相机标定问题-实践操作流程
    eNSP仿真学习,网络入门!
    SFTP服务的使用!!
    树莓派B+使用入门&RPI库安装&wringPi库安装
    Python基本语法初试
    基于51单片机+DAC0832的信号发生器
    各种标志位的含义
    根文件系统ramdisk.image.gz && uramdisk.image.gz
    Linux中/etc/inittab文件
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14072824.html
Copyright © 2020-2023  润新知