一、var 、dynamic 、Object 区分
var:声明变量,可以赋值任意对象 。Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型.
dynamic泛型:声明变量,可以赋值任意对象。声明的变量可以在后期改变赋值类型。
Object 是Dart所有对象的根基类,也就是说所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。
dynamic与var一样都是关键词,声明的变量可以赋值任意对象。 而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型。
二、final、const、static关键字
final、const相同点:
-
- 两者都是声明不可更改变量,变量只能设置一次;
- 变量类型可以省略;
final、const不同点:
final:
-
- 声明文件中的变量:必须在声明时赋值;
- 声明类的成员变量:可以在声明时赋值,也可以通过构造函数赋值语法糖ClassName({this.variable}),或者初始化列表的方式赋值;
const:
-
- 编译时常量,必须定义的时候初始化;
- const 变量是类级别的,需要标记为 static const;
- const修饰类的构造函数时,它要求该类的所有成员都必须是final的。
- 作为修饰值的时候,对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变,eg:const Point(0, 0);
const 变量 是隐式 final 的类型;
static:用于声明类变量和类方法;
它通常为全局数据变量管理内存。 静态变量和方法是类的成员,而不是单个实例。
静态变量或方法对于类的每个实例都是相同的,因此,如果我们将数据成员声明为静态,则无需创建对象即可访问它。
不需要类对象来访问静态方法或变量,我们可以通过将类名放在静态变量或方法之前来访问它。 使用类名,我们可以从其他类中调用类方法。
它在类加载时分配一次内存,并在整个程序中使用。
静态方法的概念也类似于静态变量。 静态方法是类的成员,而不是类实例。 静态方法只能使用静态变量,并且可以调用类的静态方法。
不需要创建类的实例对其进行访问。 在其他类中使用静态方法时,该方法很有用。
要点:
-
- 静态变量也被标识为类变量,静态方法也被标识为类方法;
- 可以使用类名访问静态变量和静态方法。
- 静态方法只能使用静态变量,并且可以调用类的静态方法;
- 静态变量/方法的特定副本分布在类的所有实例之间;
- 在文件中,变量不能声明为static;
附加:
Note: Instance variables can be final but not const, Final instance variables must be initialized before the constructor body starts — at the variable declaration, by a constructor parameter, or in the constructor’s initializer list.
实例变量可以是 final 类型但不能是 const 类型。 必须在构造函数体执行之前初始化 final 实例变量 —— 在变量声明中,参数构造函数中或构造函数的初始化列表中进行初始化
为什么在Dart中不能将const声明为成员变量?
const表示编译时常量。
如果在运行时创建实例来创建值,则它不再是编译时常量,因此其成员也不能是const。
静态成员不需要创建实例,因此可以是常量,无论该类是否具有const构造函数或是否与const一起使用。
编译时常量:
其值在编译时就能确定。
无需重复创建实例,在内存中只有一份。
final赋值
初始化列表的方式 class A { final value; A(int input) : value = input; } 构造函数方式 class B { int a; int b; B({this.a, this.b = 1}); }
参考:
https://dart.dev/guides/language/language-tour#final-and-const