为何被final修饰的List仍可调用add、remove方法?
为什么用final修饰List后还能调用add/remove方法?
这是因为final关键字管的是变量的引用,不是变量指向的List对象本身。
直白点说:把exaList当成一个"标签",final就是把这个标签钉死在某个List盒子上,不让你把标签摘下来贴到另一个盒子上,但完全不限制你打开这个盒子往里面加东西或者拿东西。
看你的代码:
void main() { final exaList=[1,2,3,4]; exaList.add(100); // 这是修改盒子里的内容,不是移动标签的位置 print(exaList); // 输出 [1,2,3,4,100] }
要是你尝试把标签移到另一个盒子上,编译器直接报错:
final exaList=[1,2,3,4]; exaList = [5,6,7]; // 编译错误:final变量不能重新赋值
如果想让List盒子里的东西也不能改,就得用不可变集合:
- 用
List.unmodifiable()创建不可变列表,运行时修改会抛异常:
final exaList = List.unmodifiable([1,2,3,4]); exaList.add(100); // 运行时抛出 UnsupportedError
- 用
const修饰列表,编译时就会拦住修改操作:
final exaList = const [1,2,3,4]; exaList.add(100); // 编译错误:不能修改const集合
简单总结:
- final:变量不能重新指向别的对象,但对象内部可以修改
- const/不可变集合:对象内部完全不能修改,变量也不能重新指向别的对象
内容的提问来源于stack exchange,提问作者Semih Ekmen
相关产品推荐
相关产品推荐

