导航

面试-final修饰符探讨

Posted on 2013-03-08 23:41  tnjin  阅读(206)  评论(0)    收藏  举报

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");
}

此过程没有报错,运行正常,目前尚未想明白原因。