JAVA基础语法学习之局部内部类访问局部变量

(个人学习过程对一些难点做点记录,方便复习,错误的地方希望大家指正)

匿名内部内是局部内部类的一种形式,假如只创建这个类的一个对象,那么就不必对这个类进行命名了,这里要聊的是关于局部内部类访问局部变量的问题,举个匿名内部类的例子

重点:局部内部类访问局部变量,这些局部变量必须事实上为final(见JAVA核心技术P250)

编译器会将局部变量备份到内部类的对应实例域中,该实例域会被定义为final类型,为什么要定义成final类型?

这个地方我也不是特别清楚,因为局部变量相当于被拷贝了一份在内部类中,为了保证局部类内建立的数据域与局部变量一致,则需要将变量定义为final类型

那么如果需要改变数据的值,又想使用局部内部内应该怎么做呢?看下面代码

public class LambdaTest {
    public static void main(String[] args) {
        int count = 0;
        Date[] dates = new Date[100];
        for (int i = 0; i < dates.length; i++) {
            dates[i]  = new Date(){
                @Override
                public int compareTo(Date anotherDate) {
                    System.out.println(count++);
                    return super.compareTo(anotherDate);
                }
            };

        }
    }
}

这里我们需要在匿名内部类中使用count局部变量同时需要修改count的值,但是又无法将count设为final类型,上述代码编译器会报错

 

 那么我们怎么做才能实现我们原想的功能呢?

可以使用一个长度为1的数组,数组的首地址是不会变化的,但是数组的值可以变化

posted @ 2020-12-11 10:42  二仙桥下摸鱼  阅读(490)  评论(0编辑  收藏  举报