《Java 核心技术 卷1》 笔记 第六章 接口和内部类(4) 局部内部类和局部内部类引用方法变量分析

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(4) 局部内部类和局部内部类引用方法变量分析,第1张

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(4) 局部内部类和局部内部类引用方法变量分析 6.4.3 内部类是否有用、必要和安全
    内部类将会在编译阶段翻译成用美元符号分隔内部类名和外部类名的常规类文件
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException, InterruptedException {
        Main solution = new Main();
        Main.TimePrinter tp = solution.new TimePrinter();
        Timer t = new Timer(10000,tp);
        t.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }
    Date d = new Date();
    class TimePrinter implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("the time is"+d);
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

这段代码,运行一次,再找到对应的class文件

大致参考这里,再找到对应包名,我的路径是:

F:ideapersonalleetcodeoutproductionleetcodeeditorcncom

把文件拖回IDEA(直接拖拽到IDEA窗口),可看到内容

可看到区别就是内部类其实是把外部类传参到this.this$0这个变量,作为内部类的构造了

6.4.4 局部内部类

把内部类定义在方法中,叫做局部内部类,放在方法中,方法内使用局部内部类就无需写类名前缀了:

public class Main {
    Date d = new Date();
    public static void main(String[] args) throws CloneNotSupportedException, InterruptedException {
        Main solution = new Main();
        class TimePrinter implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("the time is"+solution.d);
                Toolkit.getDefaultToolkit().beep();
            }
        }

        TimePrinter tp = new TimePrinter();
        Timer t = new Timer(10000,tp);
        t.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }
}

以下为局部内部类对比图:

局部内部类特点:

    作用域只在方法内,同个类的其他方法无法访问使用时无需带类对象前缀

6.4.5 由外部方法访问final变量

局部内部类和其他内部类相比,可以访问在局部内部类定义前,同一个方法产生的局部变量

比如可以把这个Date放到方法里面,然后内部类的变量变化为直接引用

这个部分作者说只能访问final变量,我试过了不是。不是final也可以的,但是首次赋值之后,这个变量再方法中就不能再次赋值了,否则会这样:

意思时需要是final或者效果等同于final

那不是final怎么办呢?

复制一个变量再传进来就可以了

那为啥要效果等同于final呢?有问题,看源码:

注意到这个变量中间用$1标识了,与此同时,实际上建立了把用到方法的变量自己进行了拷贝。这说明变更外部类对应的变量是危险的,使用值传递的Java无法修改局部类中对应的值。事实上这个编译报错是在提示:修改外部类值无法同步到内部类中这一事实。

 系列内容:

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

《Java 核心技术 卷1》 笔记 第五章 继承(3)

《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧

《Java 核心技术 卷1》 笔记 第六章 接口和内部类

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(2)

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(3) 接口回调与内部类

  喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。

关注公众号,互相学习:钰娘娘知识汇总

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5721764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存