摘抄:【final变量的变与不变】:有人说final变量在赋值后就不可变,那么这个不变到底指的是什么呢?这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。就是说,这个fi...
摘抄:
【final变量的变与不变】:
有人说final变量在赋值后就不可变,
那么这个不变到底指的是什么呢?
这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。
就是说,这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。
这个怎么理解?
我下面的demo可以看出即使定义了final变量,变量还是会被改变。有点懵了
public class B {
B(String a){
System.out.println("init "+a);
}
public static void main(String[] args) {
int i = 0;
while( i < 3) {
final B a = new B(String.valueOf('a'+i));
i++;
}
i = 0;
while( i < 3) {
final int a = i;
System.out.println(a);
i++;
}
}
输出:
init 97
init 98
init 99
0
1
2
有取有给,自问自答:
再次摘抄:这个final变量永远指向某个对象,是一个常量指针,而不是指向常量的指针。
1.final变量被初始化后,不可再被赋值
eg1:
final int a = 1;//a 已经指向了"1"所在的位置,这个指向不能再次被更改
a = 2;//编译报错
eg2:
final A b = new A();//b这个引用已经指向了对象所在的位置,这个指向不能再次被更改
b = new A(); //编译报错,b这个引用不能被赋值。
2.我在提问中的while语句内每次循环重新new对象。
while( i < 3) {
final B b = new B(String.valueOf('b'+i));
i++;
}
为什么这个b能被修改三次呢?
可以将while语句看做三个域各自new了局部变量对象
各个域内的局部变量不相互影响。
展开