final
属于单赋值,使用final修饰的变量必须进行初始化,一旦被赋值以后,不能被再次赋值。
const
修饰的变量它会在编译器以至于应用整个生命周期内都是不可变的常量,在内存中也只会创建一次,之后的每次调用都会复用第一次创建的对象。
使用场景:
Widget中创建的各种属性都是用final修饰的,Widget表示一帧, 赋值完成后是不会再变的。
而const可以这样来使用:
- 创建集合:
var list = const[1,2,3];
2.构造对象
var point = const Point(4,5);
3.通过基本运算得到常量
const num = 1+2;
但是Datetime
除外
const time = DateTime.now();//这样会报错
4.定义常量实体类
class Student {
final String name;
const Student(String name) : this.name = name;
}
======
main(){
var jim = const Student("Jim");
}
这里
Student
类定义了一个const
构造函数,一个类能定义const
构造函数的前提是,成员变量必须都用final
或const
修饰。
5.const
导致的不可变特性是可以传递的。如果又一个final
修饰的成员变量,这个成员变量包含了一个集合,那么这个集合仍然是可变的, 但是如果包含的是const
修饰的集合,那么集合内所有东西都是递归不可变的。
e.g.
final list0 = [1,2,3];
list0[0] = 4;
print(list0.toString());//打印[4,2,3]
======
var list1 = const[1,2,3];
list1[0] = 4;//这里会报错
扩展:
static
修饰符也能用来修饰变量, 被它修饰的成员变量,方法是属于类级别的, 并不属于对象。static
变量直到运行期使用时才会进行实例化。
网友评论