Dart回顾——var 、dynamic 、Object 区分及final、const、static关键字

一、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

https://www.w3adda.com/dart-tutorial/dart-static-keyword

https://juejin.cn/post/6844903897123799054

原文地址:https://www.cnblogs.com/lulushen/p/14102682.html