變量
變量的聲明
-
var
-
dynamic
-
Object
使用示例
var data1; // 沒有定義初始值, 可以變成任意類型 data1 = 'str'; data1 = 1; dynamic data2; data2 = 'str'; data2 = 1; Object data3; data3 = 'str'; data3 = 1;
-
區別
- var 如果沒有初始值, 可以變成任意類型
- var 有初始值類型就會被鎖定 (聲明一個初始化的變量之後, 變量的類型不可再改變)
var variable1 = 'str'; //聲明瞭初始化變量 // variable1 = 1; // 編譯不通過, variable1的類型已經被推斷爲了string
- dynamic 和 Object聲明一個初始化的變量之後, 變量的類型仍然可改變
- dynamic:動態任意類型,編譯階段不檢查類型, 如調用了該對象的一個不存在的函數, 編譯仍可通過, 運行會報錯
- Object:動態任意類型,編譯階段檢查檢查類型
變量的默認值
- 沒有初始化的變量自動獲取一個默認值: null
- 一切皆對象, 對象的默認值爲null (*一切: 包括bool, int等初始值均爲null)
final 和 const
-
共同點
-
變量的類型可以忽略
final str = "str";
-
無法修改其值
// str = 'str1'; // a final variable, can only be set once.
-
無法和var同時使用
// final var fvar = 'str'; // 編譯不通過: remove var
-
-
區別
-
類級別常量使用static const
// 如系統的 DateTime 類中: // static const int monday = 1; // static const int tuesday = 2;
-
const 常量的值可以使用其他const 常量來初始化
const width = 1; const height = 2; const square = width * height;
-
const 賦值 申明可省略
const List conList = [1,2,3]; // = const [1,2,3]
-
可以更改非final 非 const 變量的值, 即使他曾經擁有const值
var list = const [1,2,3]; list = [1]; // 可以正常編譯
-
const導致的不可變性是可傳遞的
final fList = [1,2,3]; const cList = [1,2,3]; fList[1] = 0; // fList[1,0,3] // cList[1] = 0; // Cannot modify an unmodifiable list print(fList); print(cList);
-
相同的const常量在內存中不會重複創建
const con1 = [1,2,3]; const con2 = [1,2,3]; print(identical(con1, con2)); // identical用於檢查兩個引用是否指向同一對象: true final fin1 = [1,2,3]; final fin2 = [1,2,3]; print(identical(fin1, fin2)); // false
-
const 的賦值需要是編譯時常量
final DateTime dateTime1 = DateTime.now(); // 運行時才能獲取其值 // const DateTime dateTime2 = DateTime.now(); // 編譯不通過: const variables must be initialized with a constant value. const sum = 1+2; // 正確用法: 編譯時常量
-