java中final修饰符常用来表示常量,一经定义就不可再修改,如:
final int a=5;
便不可以再更改a的值;但是对于final修饰的引用类型,即对象,其属性是可以再更改的
final Person p=new Person(); p.age=22; p.setName("Jack");
再看数组
final int[] b={1,2}; b[0]=3;//正确 b=new int[]{3,4};//编译错误
对于数组,我们知道,数组名b代表着数组空间的和地址相关的数据(这种说法为我个人理解,因为在类C语言中,一般代表数组空间的首地址,但是java中是没有地址的概念的),
由此可以判断,final修饰的变量,不可以再修改栈中的值,而对于堆中的值可以修改,
ArrayList本质是采用变长数组算法的数组,在add方法中,如果现有长度不足时,会通过通过一定算法建一个新的数组来扩展,从而可以知道ArrayList中的数组地址是会发生变化的,那么,对于final修饰的ArrayList变量在改变长度时会有异常吗?运行如下代码:
final ArrayList arr=new ArrayList(); for(int i=0;i<1000;i++){ arr.add("test_string"); }
此过程没有报错,运行正常,目前尚未想明白原因。
浙公网安备 33010602011771号