1.var dynamic Object
var:如果没有初始值,可以变成任何类型
dynamic:动态任意类型,编译阶段不检查类型
Object:动态任意类型,编译阶段检查检查类型
区别:
唯一区别 var 如果有初始值,类型被锁定
没有初始化的变量默认值都是null。一切皆对象,对象的默认值是null
variable.dart
void main(){
//未初始化变量声明var dynamic Object
dynamic data;
data = 1;
data = 'aaaa';//var dynamic Object 未初始化的变量可以重新赋值
//声明初始化变量
var data1 = 123;
// data1 = "2222";//报语法错误 var 初始化的变量不能再赋值
dynamic data2 = 'aaaa';
data2 = '21'; //dynamic初始化的变量 可以重新再赋值
Object data3 = 'eeee';
data3 = 'oooo'; //Object初始化的变量 可以重新再赋值
dynamic d1 = '1234';
Object o1 = '1111';
d1.test(); //dynamic编译的时候不会去检查类型,但是运行的时候还是会报错
// o1.test(); //报语法错误,Object编译的时候会检查类型
}
2.变量final和const不能和var同时使用
void main(){
//1. 被final或者const修饰的变量,变量类型可以省略
final fVariable1 = 'aaaaaa';
//上面的语句相当于下面的 final String fVariable1 = 'aaaaaa';
const cVariable1 = 'bbbbb';
// 上面的语句相当于下面的 const String cVariable1 = 'bbbbb';
//2. 被 final 或 const 修饰的变量无法再去修改其值。
// fVariable1 = 'damon';//有语法错误,不能修改值
// cVariable1 = 'damon';//有语法错误,不能修改值
//3. final或const不能和var同时使用。
// const var fff = 'ccc';//有语法错误 const var不能一起使用
// final var fff = 'ccc';//有语法错误 final var不能一起使用
//4. 如果是类级别常量,使用static const
DateTime; //可参照DateTime static const int monday = 1;
//5. const可以使用其他 const常量的值来初始化其值
const width = 100;
const height = 100;
const square = width * height;
//6. const赋值 申明可省略
const List clist = [1, 2, 3]; //const可以省略
// const List clist = const [1, 2, 3];//dart 2之前,const赋值必须用const声明
//7. 可以更改非final,非const变量的值,即使它曾经具有const值
var varList = const [1, 2, 3];
final finalList = const [1, 2, 3];
const constList = [1, 2, 3];
varList = [1];
// constList = [1]; //有语法错误 不能修改final变量的值
// finalList = [1]; //有语法错误 不能修改const变量的值
//8. const导致的不可变性是可传递的
final List ls = [1, 2, 3];
ls[1] = 4;
print(ls); //输出 [1, 4, 3]
const List ls1 = [1, 2, 3];
// ls1[1] = 4; //有语法错误 不能修改const里面的元素的值
//9. 相同的const常量不会在内存中重复创建
final finalList1 = [1, 2];
final finalList2 = [1, 2];
print(identical(finalList1, finalList2)); //输出false identical用于检查两个引用是否指向同一个对象
const constList1 = [1, 2];
const constList2 = [1, 2];
print(identical(constList1, constList2)); //输出true identical用于检查两个引用是否指向同一个对象
//10. const 需要是编译时常量
var finalDateTime = DateTime.now();
print(finalDateTime); //2020-06-17 01:17:32.973108 打印当前的时间
final DateTime finalDateTime1 = DateTime.now();
// const DateTime constDateTime = DateTime.now();//报语法错误 DateTime.now() 是运行期计算出来的值
}