参考:http://codingdict.com/blog/article/2018/12/13/619.html
main() {
// "static" 表示成员在类本身上可用,而不是在类的实例上。
// 这就是它的意思,并没有用于其他地方。 static修饰成员。
//
// "final" 表示单一赋值:final变量或字段【必须初始化】。
// 一旦赋值,就不能改变final变量的值。 final修饰变量。
//
// "const" 的含义在Dart中有点复杂和微妙。 const修饰值,可以在创建集合时使用它,
// 例如const [1,2,3] ,以及构造对象(代替new),比如const Point(2,3)。
// 这里,const意味着对象的整个深度状态可以在编译时完全确定,
// 并且对象将被冻结并完全不可变。
//
// const对象有几个有趣的属性和限制:
// 1.必须根据可在编译时计算的数据创建它们。 const对象无法访问运行时需要计算的任何内容。
// 1+2是一个合法的const表达式,但new DateTime.now()不是(合法的const表达式)。
// 2.它们是深层不能改变的。 如果你有包含集合的final字段,则该集合仍然可变。
// 如果你有一个const集合,那么它中的所有东西也必须是递归的const。
// 3.它们是规范化的。 这有点像字符串内联:
// 对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象。
// 也就是说:
// getConst1() {
// return const [1, 2];
// }
// //等价于
// getConst2() => const [1, 2];
//
// main() {
// var a = getConst2();
// var b = getConst2();
// print(a === b); // true
// }
int Func() {
// 代码
}
final int m1 = 60;
final int m2 = Func(); // 正确
const int n1 = 42;
// const int n2 = Func(); // 错误
// 在上面的例子中,m2的值是不变的,但如果不把代码运行起来,你无法知道m2是多少。
final name = 'Bob'; // 正确
// name = 'Alice'; // 错误,final 变量只能赋值一次
// const name1; // 错误,const 变量是编译时常量,需要在声明时赋值进行初始化
// final name1; // 错误,final变量需要在声明时赋值进行初始化
const name2 = 'Alice'; // 正确
// const name3 = name; // 错误,name 是个变量,不能赋给const
final name4 = name2; // 正确,可以把const 常量赋给 final 变量
// final names1 = const[name, 3, 4]; // 错误,name 是个变量,不能赋给const
final names2 = const [name2, 'Allen', 'Brian'];
const names3 = [
'A',
'B',
'C'
]; // 正确。这里与参考 http://www.cndartlang.com/658.html 有点差别,经实测是正确的
const names4 = const ['A', 'B', 'C']; // 正确。
print(names3[1]);
print(names4[1]);
}