java中final关键字问题

final修饰的变量不是一经赋值就不能改变吗?为什么输出结果却是多个?

img

img

  • 不同实例对象,有自己的常量属性,就像你这里的枚举对象PENNY、DINE等等
  • 常量不能修改,说的是同一个实例对象里的常量,一经赋值,后续该变量就不能修改了

final修饰的变量确实是一经赋值就不能再次改变了。但是,如果使用final修饰一个数组或者集合,那么虽然数组或者集合本身不能改变,但是数组或者集合中的元素是可以改变的。因此,虽然数组或者集合是final的,但是数组或者集合中的元素是可以修改的,这也是为什么在输出结果时会有多个的原因。
例如,下面的代码中定义了一个final的List集合,虽然该集合本身不能再次赋值,但是集合中的元素是可以修改的:

java
Copy code
final List list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("!");
list.set(1, "everyone");
System.out.println(list);

输出结果为:[hello, everyone, !]
可以看到,虽然List集合是final的,但是集合中的元素可以通过set方法进行修改,因此输出结果中有多个元素。
需要注意的是,如果使用final修饰一个基本类型的变量,那么该变量的值确实是一经赋值就不能再次改变了,例如:

java
Copy code
final int num = 10;
num = 20; // 编译错误,final变量不能再次赋值

这样的代码会在编译时就报错,因为final修饰的变量是常量,一经赋值就不能改变。