You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何被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盒子里的东西也不能改,就得用不可变集合:

  1. 用List.unmodifiable()创建不可变列表,运行时修改会抛异常:
final exaList = List.unmodifiable([1,2,3,4]);
exaList.add(100); // 运行时抛出 UnsupportedError
  1. 用const修饰列表,编译时就会拦住修改操作:
final exaList = const [1,2,3,4];
exaList.add(100); // 编译错误:不能修改const集合

简单总结:

  • final:变量不能重新指向别的对象,但对象内部可以修改
  • const/不可变集合:对象内部完全不能修改,变量也不能重新指向别的对象

内容的提问来源于stack exchange,提问作者Semih Ekmen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:31:08