Dart 类型声明

Dart是一门强类型语言,但是声明变量时既可以用静态类型声明,也可以用var可选类型声明,还有dynamic类型声明,因为Dart能进行类型推断。

声明种类

  • 静态类型
  • var 可选类型
  • dynamic 动态类型
  • Object 基类声明

分类说明

  1. 静态类型

声明变量的时候,使用明确的数据类型:

  1. String name = 'lynn';
  2. int number = 123;
  1. var 可选类型

使用 var 声明变量,不需要指定变量的明确类型,因为Dart会自动推断其数据类型,所以可以使用var来定义任何的变量:

  1. var name = "lynn";
  2. var number = 123;
  3. var boolean = false;
  4. // 注意 上面的例子都是有初始值的,也就是在声明变量的同时并赋值了,但是如果你没设置初始值,它是可变的,例如:
  5. var Cname
  6. Cname = "lee lynn";
  7. Cname = 123;
  8. Cname = true;
  9. Cname = { key: "123" };
  10. // 综合上述例子,我们可以知道, var 声明的同时并没有初始值(赋值),那么它是可变的,但是如果有初始值,它将被锁定,不能被更改。

那么为什么Dart中它可以定义所有的变量呢?

原因是var并不是用来直接存储值的,而是存储的值是对象的引用,就比如上面的例子: var name = 'lynn' , name 存储了值为 lynnString对象的引用。

  1. dynamic 动态类型

dynamic 的意思是数据类型是动态可变的,也可以定义为任何的变量,但是和 var 不相同的是, var一旦赋值以后,就不能改变数据类型了。

  1. dynamic name = 'lynn';
  2. name = 1;
  3. var content = 'Dart 语法';
  4. // content = 1; 报错
  1. Object 基类声明

Dart 里所有东西都是对象,是因为 Dart 的所有东西都继承自 Object,因此 Object 可以定义任何变量,而且赋值后,类型也可以更改:

  1. Object index = 100;
  2. index = 'string';

没错, 它和 dynamic 一模一样,只不过区别在于:

Object 编译阶段检查类型, 而 dynamic 编译阶段不检查类型

  1. finalconst

使用过程中从来不会被修改的变量,可以使用 finalconst

final修饰的变量,必须在定义时将其初始化,其值在初始化后不可改变;
const用来定义常量。

它们的区别在于,constfinal更加严格。final只是要求变量在初始化后值不变,但通过final,我们无法在编译时(运行之前)知道这个变量的值;而const所修饰的是编译时常量,我们在编译时就已经知道了它的值,显然,它的值也是不可改变的。

那么如何理解 const所修饰的是编译时常量 这句话的呢? 下面请看代码演示:

  1. // final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量:
  2. final name = 'lynn';
  3. // name = 'lee lynn'; //运行出错,因为final修饰的变量不能调用其setter方法,即:不能设值
  4. // const:只能被设一次值,在声明处赋值,且值必须为编译时常量;用于修饰常量。
  5. const num = 123;
  6. // num = 234; 出现异常,const修饰的变量不能调用setter方法,即:不能设值,只能在声明处设值
  7. const atm = 1.01325 * num; // 值的表达式中的变量必须是编译时常量(num);
  8. var num1 = 12; // 定义一个非编译时常量
  9. // atm = 1 * num1 出错,因为 num1 不是一个编译时常量,即:非const修饰的变量(只有const修饰的变量才是编译时常量)

默认值

未初始化的变量默认值是 null。即使变量是数字 类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型 也不例外。