一.var、Object 和dynamic 关键字的区别
1.var是一种语法不是一个类型,声明的变量会被反推其具体的类型,所以该变量可以使用所有对应具体类型的方法,类型确定后不可变,比如var name="张三" ; name=2;就会报错,
2.Object 和dynamic都是一种类型,都可以在确定类型之后更改变量的类型,比如dynamic name=2; name="张三" ; 是可以的,但无法使用最后类型的方法,比如想调用name.substring()是会报错的,因为dynamic类型没有该方法
3.dynamic是运行时确定实际类型,比如dynamic name="aaa"; name++;编译通过,运行时会报错
总结:var最常用,使用Object 和dynamic需要小心,很多问题编译时无法发现,运行时会报错,类型不确定且是单一类型使用var,若类型不限于单一类型使用Object 或dynamic
二.const和final的区别
1.final修饰的变量初始化后不可再被赋值,若变量是基本类型则值不可修改,若变量是引用则该引用不能重新赋值改变引用地址,修饰类则该类不能被继承,修饰方法不能被重写.
2.const定义常量,编译时就需要确定其值
注:final和const都不能和var一起使用
总结:const比final更严格,final编译时可以不确定其值,比如final int f=func();可以 const int c=func();则不行
在flutter的hot reload时,修改const修改的初始值正常反馈,但是修改final的初始化值必须重启才可以,因为final修饰的被视为状态不会改变,const的字段被视为别名.
三.特殊运算符
1. ?. : Test?.funs从表达式Test中选择属性funs,除非Test为空(当Test为空时,Test?.funs的值为空)
2. ?? : expr1 ?? expr2 表示如果expr1非空,则返回其值; 否则返回expr2的值
3. ~/ : 整除,结果抹掉小数取整数
4. as : (a as b).method(); 相当于 if(a is b){ a.method() };
四.dart标记
1.跳出代码块: 可以标记一块代码块,当代码块内的逻辑需要跳出时可以使用break 标记
例: void test(String a){
void tests(String a){
error:{
if(a==null)break error;
print("若a为null则该处不会执行");
}
print("只要该处之前没有return,不管a是不是null都会执行");
}
五.类与函数
1.隐式接口: 每个类都隐式定义了一个接口,包含该类的所有变量和方法.
当创建了任何一个类A,其他类B可以直接使用implements该类的名称,如B implements A,此时B需要重写A的所有变量和方法否则会报错,此时implements 的A就是定义类A隐式创建的接口.
2.call()方法:一个类定义了call()之后,允许像函数一样调用类.
例:class TestClass{
call(int a,int b)=>print(a+b);
}
TestClass test=TestClass();
print(test(1,200));