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的数组,数组的首地址是不会变化的,但是数组的值可以变化