Java 中,一个 final 的 List 变量,被往里加了元素,算不算违反了 final 这个关键词在这里暗示的约定?
2021-12-31 10:44:16 +08:00
Newyorkcity
final 关键词在 java 中,只能保证变量的值不变,但如果变量的值是一个本身提供了修改自身的方法的对象,那调用这一方法对值(内部)做修改,final 是约束不到的。
然而这样的修改,是否是违背了 final 这个关键词放在这里时暗示的约定——该变量是不可变的?或者说,如果让一个全知全能的家伙来编写 Java ,它是否会为 final 所修饰的变量保证无论如何都无法被修改而不仅仅只是引用无法被修改的限制?(也就是说,java 之所以不能实现到这一步,是否可能是因为在编译器层面强制实现这一程度所需要的工程量太大划不来)
final int a = 0; //值赋值 final AtomInteger a = new AtomInteger(0); //引用对象(也就是指针)赋值 final 修饰符是用来标识变量赋值后不能进行重复赋值 final int a 只能赋值一次。 而 final AtomInteger a 也是赋值一次(指针赋值)
sdushn
2021-12-31 17:54:23 +08:00
final 是对 对象地址的限定。 final int a = 0 ,a 变为 1 是不可接受的。并非是值的变化不可接受,而是 a 对象地址不能变,如果 值 0 所在的地址可以变更为 值 1 ,那么 a 的值也可以从 0 变 1 。
List 集合 -->火车见过吧,就比作火车好了 final List --> D3062 次列车就是这个编号 xxx 的车,不能用别的车 每天坐的人不一样能说 火车变了吗,火车还是那个火车。 其实就是一个概念的问题,你认为 一个 List 就应该是 List + 它的元素 ,但很明显 Java 设计的就是 List 只是容器,你说的这层 “final” 只能你自己去实现。