final
屬于單賦值尽爆,使用final修飾的變量必須進行初始化,一旦被賦值以后读慎,不能被再次賦值漱贱。
const
修飾的變量它會在編譯器以至于應(yīng)用整個生命周期內(nèi)都是不可變的常量,在內(nèi)存中也只會創(chuàng)建一次贪壳,之后的每次調(diào)用都會復(fù)用第一次創(chuàng)建的對象饱亿。
使用場景:
Widget中創(chuàng)建的各種屬性都是用final修飾的,Widget表示一幀闰靴, 賦值完成后是不會再變的彪笼。
而const可以這樣來使用:
- 創(chuàng)建集合:
var list = const[1,2,3];
2.構(gòu)造對象
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
構(gòu)造函數(shù),一個類能定義const
構(gòu)造函數(shù)的前提是蚂且,成員變量必須都用final
或const
修飾配猫。
5.const
導(dǎo)致的不可變特性是可以傳遞的。如果又一個final
修飾的成員變量杏死,這個成員變量包含了一個集合泵肄,那么這個集合仍然是可變的, 但是如果包含的是const
修飾的集合淑翼,那么集合內(nèi)所有東西都是遞歸不可變的腐巢。
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
變量直到運行期使用時才會進行實例化遭京。