关于java final,并非不可更改值

对于final型的变量,一般情况下是在赋值后就不能改变值了。但是,对于数组,仍然能够修改元素值。例如:

int counter = 0;
Date[] dates = new Date[100];
for(int i = 0; i< dates; i++){
    dates[i] = new Date(){
             public int compareTo(Date other){
                       counter++;//ERROR
                       return super.compareTo(other);
             }
     }
}

上例中,counter++出错误的原因是:dates[i] = new Date(){...}创建了一个本地内部类(Local inner class),传递给该本地内部类的变量都要转换为final,这样的原因是new Date()只会在内存中临时存在,会被JVM删除,所以counter要为final型;

但是,如果像下面这样就可以修改counter的值了:

final int[] counter = new int[1];
for(int i=0; i<dates.length; i++){
  dates[i] = new Date(){
          public int compareTo(Date other){
                   counter[0]++;
                   return super.compareTo(other);
           }
  }
}

数组仍然被定义为final,仅仅意味着我们不能将其赋值为其它数组,我们可以修改数组元素的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值