Java 中,一个 final 的 List 变量,被往里加了元素,算不算违反了 final 这个关键词在这里暗示的约定?
2021-12-31 10:44:16 +08:00
Newyorkcity
final 关键词在 java 中,只能保证变量的值不变,但如果变量的值是一个本身提供了修改自身的方法的对象,那调用这一方法对值(内部)做修改,final 是约束不到的。
然而这样的修改,是否是违背了 final 这个关键词放在这里时暗示的约定——该变量是不可变的?或者说,如果让一个全知全能的家伙来编写 Java ,它是否会为 final 所修饰的变量保证无论如何都无法被修改而不仅仅只是引用无法被修改的限制?(也就是说,java 之所以不能实现到这一步,是否可能是因为在编译器层面强制实现这一程度所需要的工程量太大划不来)
@Newyorkcity final 和 immutable 是不一样的 final 是指这个变量不能再赋值,也就保证了这个变量的值不会改变 引用变量,他的值是地址,你改变的是地址指向的内存中内容
举个例子,公司的员工管理系统保存了你的家庭地址,但你做的是改变你家的家具。 如果你的家庭地址是 final ,你就不能再搬家了,但你怎么改变你家的布置是没有限制的
geekfxxk
2021-12-31 11:52:58 +08:00
值类型,引用类型没理解好
yolee599
2021-12-31 11:55:25 +08:00
假设有一个“人”,用来找到这个“人”的关键字叫“身份证号”,现在我们定义“身份证号” 是 final 的,一经赋值就不会变了,无论你身高怎么变,体重怎么变,年龄怎么变,性别怎么变。“身份证号”还是那个“身份证号”。
现在把上面例子的“身份证号”替换为“对象”,是不是就好理解多了。
Asan
2021-12-31 11:58:10 +08:00
final 不能修改改的是引用,但是引用指向的内存是可以涂涂改改的
AoEiuV020CN
2021-12-31 12:01:38 +08:00
这种问题学 c 语言的时候讲的比较清楚,因为不搞清楚真的容易炸, 指针不变和内容不变,两码事,基本类型不是指针,不存在指针不变的用法,引用类型指针不变情况内容变没问题,
timethinker
2021-12-31 12:04:53 +08:00
一个变量到底存储的是什么?变量类型指明了存储的数据如何使用,对于一个 int 类型的变量来说,存储的就是实际的数字。对于对象来说,存储的就是一个内存地址,它被解释为具体类型在内存中的起始地址加上成员变量类型偏移量。以上这些只是一些表面的解释,编译器或者解释器 /虚拟机会根据这些信息来优化,并最终操作计算机。
所以 final 修饰的是变量值不可改变,而不是这个值再被用来解释翻译,并操作其他内存的数据不可改变。
dcsuibian
2021-12-31 12:40:38 +08:00
“final AtomicInteger a= new AtomicInteger(0) 的 a ,由 0 变 1” a 既不是 0 也不是 1 ,而是一个 AtomicInteger 实例,一直都是这个实例,没有变过 如果我写了一个 final CustomClass c=new CustomClass(arg1,arg2,arg3) 那么我的 c 就一直是这个 CustomClass 啊,你把 AtomicInteger 和数字直接连起来了,但其实它们是分开的