### 变量与常量
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';
~~~