一、 变量:var
场景:当一个人的年龄从20岁变成21岁,存储数据发生变化,需要用变量来进行声明
关键字:var
语法:var 变量名=值/表达式
- 注意:使用var声明的变量,其
类型在第一次赋值之后确定,不能再赋值其他类型的值 不可重复声明
二、 常量:const
场景:当做圆形计算的时候,π的值一开始就是被确定的,且不允许更改,使用const进行声明
关键字:const
语法:const 属性名=值/表达式;
- 特点:const是代码编译前被确定,不允许表达式中有变量存在,必须为常量或者固定值
三、 常量:final
场景:当我们需要当前时间作为当前唯一的操作时间,时间一旦被确定就不可以被修改
关键字:final
语法:final属性名=值/表达式;
- 特点:final变量在运行时被初始化,其值设置后不可更改
总结
变量:当需要存储一个变化的数据需要使用var来声明变量
编译时常量:当需要存储一个不变的数据,且在编译时就确定,需要使用const声明常量
运行时常量:当需要存储一个不变的数据,但是在运行时才确定,需要使用final声明常量
const 和final的区别
Dart 中 const 与 final 的区别
| 特性/对比点 | final | const |
|---|
| 不可变性质 | 运行时不可变(runtime constant) | 编译时不可变(compile-time constant) |
| 何时赋值 | 运行时赋值 | 必须在编译期可确定 |
| 能否再次赋值 | ❌ 不能重新赋值 | ❌ 不能重新赋值 |
| 值是否必须是编译期常量 | ❌ 不要求 | ✅ 必须是编译期常量 |
| 内部值是否可变 | 内部值可变(引用不可变) | 完全不可变(深度不可变) |
| 是否会实例复用(canonicalization) | ❌ 不会 | ✅ 会复用相同常量实例 |
| 典型使用场景 | 运行时才知道的值,如 DateTime.now()、API 返回结果 | 配置常量、UI 常量、不可变对象、常量构造函数 |
| 示例 | final time = DateTime.now(); | const pi = 3.14; |
🔍 示例说明
final(运行时确定)
final list = [1, 2, 3];
list.add(4);
list = [5];
✔ final:引用锁死,内容可改
✔ const:引用锁死,内容也锁死(编译期常量)