zoukankan      html  css  js  c++  java
  • 为什么在匿名内部类中引用外部对象要加final修饰符

    当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

    为什么必须要为final呢?

          首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一class文件,仅仅只保留对外部类的引用。当外部类传入的参数需要被内部类调用时,从java程序的角度来看是直接被调用:

    public class OuterClass {
        public void display(final String name,String age){
            class InnerClass{
                void display(){
                    System.out.println(name);
                }
            }
        }
    }
      从上面代码中看好像name参数应该是被内部类直接调用?其实不然,在java编译之后实际的操作如下:
    public class OuterClass$InnerClass {
        public InnerClass(String name,String age){
            this.InnerClass$name = name;
            this.InnerClass$age = age;
        }
        
        
        public void display(){
            System.out.println(this.InnerClass$name + "----" + this.InnerClass$age );
        }
    }

    简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。

          故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。

    发现jdk1.8必须加final,jdk13又不用加final,java语法糖会在底层自动加上,网络搜索得到1.9开始默认加上final。

  • 相关阅读:
    jstree 实现异步加载子节点
    创建 widget 窗口小组件
    Android(permission)常用权限
    Android 之 补间动画
    补间动画之 AlphaAnimation
    (转)向对象开发与面向组件开发的区别
    Android Drawable文件夹对应像素密度
    Notification(通知) 简单用法
    AlarmManager 用法
    关于IntentService 用法
  • 原文地址:https://www.cnblogs.com/zjwoo/p/14049180.html
Copyright © 2011-2022 走看看