final
和const
相同点
- 类型声明可以省略
- 初始化后不能再重新赋值
- 不能和
var
同时使用
dart
final a = 'hello';
final String b = 'world';
const c = 123;
const double d = 456.1;
final var e = 'test'; // IDE报错
a = 'haha'; // IDE报错,不能再重新赋值
c = 1.23; // IDE报错,不能再重新赋值
不同点
const
初始化时需要一个真正意义上是确定的值
dart
final finalDt = DateTime.now();
const constDt = DateTime.now(); // 报错,因为在运行时获取到的值是动态的
- 不可变性可传递
dart
final List fList = [1, 2, 3];
fList[0] = 9;
print(fList); // [9, 2, 3]
const List cList = [1, 2, 3];
cList[0] = 9; // 运行时报错, 因为const标记的列表中的每个值也是不能被修改的
print(cList);
final
标记的多个相同值的变量各占一份内存空间的,而const
标记的多个相同值的变量共用一份内存空间,类似 C 语言中的指针
dart
final a1 = [11, 22];
final a2 = [11, 22];
print(identical(a1, a2)); // false
const b1 = [11, 22];
const b2 = [11, 22];
print(identical(b1, b2)); // true
identical
通过比较两个变量引用的是否是同一个内存地址(指针)来判断是否相等