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

如何理解Flutter中final修饰变量、const修饰值的含义与二者区别

「final modifies variable & const modifies value」含义解析

这句话的中文翻译是 final修饰变量,const修饰值,是Dart(Flutter开发所用的编程语言)中两个关键字核心差异的高度概括,具体解释如下:


1. final修饰变量

final的约束对象是变量本身的引用指向,你可以把变量理解为一个存储值的“盒子”,final仅要求这个盒子一旦装入某个值后,就不能再装入其他值,但不会限制盒子内部存储的值本身是否可修改。

代码示例

// 示例1:基础类型final变量
final num = 10;
num = 20; // 编译报错:final变量的引用指向不可修改,不能再指向另一个数值

// 示例2:可变类型final变量
final list = [1,2,3];
list.add(4); // 正常执行:修改的是list指向的数组的值,没有变更list本身的引用
print(list); // 输出 [1,2,3,4]
list = [5,6,7]; // 编译报错:不能让final变量指向新的数组对象

额外特性:final变量的赋值可以在运行时完成,比如你可以把接口请求返回的结果、当前时间等运行时才能确定的值赋值给final变量,只要赋值一次后就不可再修改。


2. const修饰值

const的约束对象是值本身,要求被修饰的值必须在编译期就完全确定,且生成后完全不可变更,相当于这个值在编译阶段就被“冻结”,所有引用相同内容const值的变量,都会指向内存中同一个不可变对象。

代码示例

// 示例1:const值本身不可变
const list = [1,2,3];
list.add(4); // 编译报错:const修饰的数组本身是不可变的,不能修改它的内容

// 示例2:const值的内存复用特性
var a = const [1,2,3];
var b = const [1,2,3];
print(identical(a,b)); // 输出 true:两个变量指向的是同一个编译期生成的const值

额外特性:如果用const修饰变量,相当于叠加了两层约束:首先变量的引用指向不可变(和final的特性一致),其次变量指向的是编译期确定的不可变const值。


核心差异总结

  • 约束对象不同:final仅约束变量的引用指向,不约束值的可变性;const直接约束值本身完全不可变
  • 赋值时机不同:final可以接收运行时生成的值,const只能接收编译期就能确定的常量值
  • 内存特性不同:相同内容的const值会复用同一块内存空间,final修饰的变量如果指向非const值,不会做内存复用

内容的提问来源于stack exchange,提问作者Asghar Ali Hazara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:48:05