### 變量與常量
1. ***變量聲明與初始化***
* 調用的變量name包含對String值為“張三” 的對象的引用,name推斷變量的類型是String,但可以通過指定它來更改該類型,如果對象不限于單一類型(沒有明確的類型),請使用Object或dynamic關鍵字。
~~~
// 沒有明確類型,編譯的時候根據值明確類型
var name = ‘Bob’;
Object name = '張三';
dynamic name = '李四';
// 顯示聲明將被推斷類型, 可以使用String顯示聲明字符串類型
String name = 'Bob' ;
~~~
2. ***默認值***
* 未初始化的變量的初始值為null(包括數字),因此數字、字符串都可以調用各種方法
~~~
//測試 數字類型的初始值是什么?
int lineCount;
// 為false的時候拋出異常
assert(lineCount == null);
print(lineCount); //打印結果為null,證明數字類型初始化值是null
~~~
3. ***final and const***
* 如果您從未打算更改一個變量,那么使用 final 或 const,不是var,也不是一個類型。
一個 final 變量只能被初始化一次; const變量是一個編譯時常量,(Const變量是隱式的final)
final的頂級或類變量在第一次使用時被初始化。
* 被final修飾的頂級變量或類變量在第一次聲明的時候就需要初始化。
~~~
// The final variable 'outSideFinalName' must be initialized.
final String outSideFinalName
~~~
* 被final或者const修飾的變量,變量類型可以省略,建議指定數據類型。
~~~
//可以省略String這個類型聲明
final name = "Bob";
final String name1 = "張三";
const name2 = "alex";
const String name3 = "李四";
~~~
* 被 final 或 const 修飾的變量無法再去修改其值。
~~~
final String outSideFinalName = "Alex";
// outSideFinalName', a final variable, can only be set once
// 一個final變量,只能被設置一次。
outSideFinalName = "Bill";
const String outSideName = 'Bill';
// 這樣寫,編譯器提示:Constant variables can't be assigned a value
// const常量不能賦值
// outSideName = "小白";
~~~
* flnal 或者 const 不能和 var 同時使用
~~~
// Members can't be declared to be both 'const' and 'var'
const var String outSideName = 'Bill';
// Members can't be declared to be both 'final' and 'var'
final var String name = 'Lili';
~~~
* 常量如果是類級別的,請使用 static const
~~~
// 常量如果是類級別的,請使用 static const
static const String name3 = 'Tom';
// 這樣寫保存
// Only static fields can be declared as const
// 只有靜態字段可以聲明為const
//const String name3 = 'Tom';
~~~
* 常量的運算
~~~
const speed = 100; //速度(km/h)
const double distance = 2.5 * speed; // 距離 = 時間 * 速度
final speed2 = 100; //速度(km/h)
final double distance2 = 2.5 * speed2; // 距離 = 時間 * 速度
~~~
* const關鍵字不只是聲明常數變量,您也可以使用它來創建常量值,以及聲明創建常量值的構造函數,任何變量都可以有一個常量值。
~~~
// 注意: [] 創建的是一個空的list集合
// const []創建一個空的、不可變的列表(EIL)。
var varList = const []; // varList 當前是一個EIL
final finalList = const []; // finalList一直是EIL
const constList = const []; // constList 是一個編譯時常量的EIL
// 可以更改非final,非const變量的值
// 即使它曾經具有const值
varList = ["haha"];
// 不能更改final變量或const變量的值
// 這樣寫,編譯器提示:a final variable, can only be set once
// finalList = ["haha"];
// 這樣寫,編譯器提示:Constant variables can't be assigned a value
// constList = ["haha"];
~~~
* 在常量表達式中,該運算符的操作數必須為'bool'、'num'、'String'或'null', const常量必須用conat類型的值初始化。
~~~
const String outSideName = 'Bill';
final String outSideFinalName = 'Alex';
const String outSideName2 = 'Tom';
const aConstList = const ['1', '2', '3'];
// In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'
// 在常量表達式中,該運算符的操作數必須為'bool'、'num'、'String'或'null'。
const validConstString = '$outSideName $outSideName2 $aConstList';
// Const variables must be initialized with a constant value
// const常量必須用conat類型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideFinalName';
var outSideVarName='Cathy';
// Const variables must be initialized with a constant value.
// const常量必須用conat類型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideVarName';
// 正確寫法
const String outSideConstName = 'Joy';
const validConstString = '$outSideName $outSideName2 $outSideConstName';
~~~