dart官網(wǎng)定義:
final和const
使用過程中從來不會(huì)被修改的變量晚岭, 可以使用?final?或?const, 而不是?var?或者其他類型芥颈, Final 變量的值只能被設(shè)置一次; Const 變量在編譯時(shí)就已經(jīng)固定 (Const 變量 是隱式 Final 的類型.) 最高級 final 變量或類變量在第一次使用時(shí)被初始化丛肢。
提示:?實(shí)例變量可以是?final?類型但不能是?const?類型闯睹。 必須在構(gòu)造函數(shù)體執(zhí)行之前初始化 final 實(shí)例變量 —— 在變量聲明中,參數(shù)構(gòu)造函數(shù)中或構(gòu)造函數(shù)的初始化列表中進(jìn)行初始化梧奢。
理解
這里先多說一嘴”編譯時(shí)常量“和”運(yùn)行時(shí)常量“
比如在java中狱掂,
public final static String name = ”test“;//編譯時(shí)常量亲轨,在聲明變量賦值趋惨,并且不依賴運(yùn)行時(shí)的類狀態(tài)
public final static int length = ”test“.length();//運(yùn)行時(shí)常量,依賴運(yùn)行時(shí)的類狀態(tài)
final:只能被設(shè)一次值惦蚊,在聲明處賦值器虾,值和普通變量的設(shè)值一樣,可以是對象养筒、字符串曾撤、數(shù)字等,用于修飾值的表達(dá)式不變的變量晕粪;
final int a = 1;
a = 2;//編譯報(bào)錯(cuò)?The final variable 'a' can only be set once
String name = "aaa";
final int b = 2 * name.length;//編譯成功? 運(yùn)行時(shí)常量
const:只能被設(shè)一次值挤悉,在聲明處賦值,且值必須為編譯時(shí)常量巫湘;用于修飾常量装悲。
const int a = 1;//編譯成功
const int a = 2 * 3;//編譯成功
String name = "aaa';
const int b = 3 * name.length;//編譯報(bào)錯(cuò)?Const variables must be initialized with a constant value.
const還可以用來聲明常量值
var a = const[];// const[]創(chuàng)建一個(gè)空數(shù)組,a就是一個(gè)空數(shù)組尚氛。是可以再次賦值的
final b = const[];//被final修飾诀诊,那么就不能再次被賦值了
const c = const[];//直接是編譯時(shí)常量了
注意:a = [3,3,3]; //編譯成功 運(yùn)行成功
final修飾的基本類型是值不能被修改,但是修飾的是引用類型阅嘶,比如數(shù)組属瓣,集合,map讯柔,是可以改變里面的內(nèi)容抡蛙,const不行
final a = [1];
a[0] = 3;//編譯成功
const b = [3];
b[0] = 4;//編譯成功,運(yùn)行報(bào)錯(cuò)??Unsupported operation: Cannot modify an unmodifiable list