Dart 类型声明
Dart是一门强类型语言,但是声明变量时既可以用静态类型声明,也可以用var可选类型声明,还有dynamic类型声明,因为Dart能进行类型推断。
声明种类
- 静态类型
var可选类型- dynamic 动态类型
- Object 基类声明
分类说明
- 静态类型
声明变量的时候,使用明确的数据类型:
String name = 'lynn';int number = 123;
var可选类型
使用 var 声明变量,不需要指定变量的明确类型,因为Dart会自动推断其数据类型,所以可以使用var来定义任何的变量:
var name = "lynn";var number = 123;var boolean = false;// 注意 上面的例子都是有初始值的,也就是在声明变量的同时并赋值了,但是如果你没设置初始值,它是可变的,例如:var Cname;Cname = "lee lynn";Cname = 123;Cname = true;Cname = { key: "123" };// 综合上述例子,我们可以知道, var 声明的同时并没有初始值(赋值),那么它是可变的,但是如果有初始值,它将被锁定,不能被更改。
那么为什么Dart中它可以定义所有的变量呢?
原因是var并不是用来直接存储值的,而是存储的值是对象的引用,就比如上面的例子: var name = 'lynn' , name 存储了值为 lynn的 String对象的引用。
- dynamic 动态类型
dynamic 的意思是数据类型是动态可变的,也可以定义为任何的变量,但是和 var 不相同的是, var一旦赋值以后,就不能改变数据类型了。
dynamic name = 'lynn';name = 1;var content = 'Dart 语法';// content = 1; 报错
- Object 基类声明
Dart 里所有东西都是对象,是因为 Dart 的所有东西都继承自 Object,因此 Object 可以定义任何变量,而且赋值后,类型也可以更改:
Object index = 100;index = 'string';
没错, 它和 dynamic 一模一样,只不过区别在于:
Object编译阶段检查类型, 而dynamic编译阶段不检查类型
final和const
使用过程中从来不会被修改的变量,可以使用 final 和 const 。
用final修饰的变量,必须在定义时将其初始化,其值在初始化后不可改变;
const用来定义常量。
它们的区别在于,const比final更加严格。final只是要求变量在初始化后值不变,但通过final,我们无法在编译时(运行之前)知道这个变量的值;而const所修饰的是编译时常量,我们在编译时就已经知道了它的值,显然,它的值也是不可改变的。
那么如何理解 const所修饰的是编译时常量 这句话的呢? 下面请看代码演示:
// final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量:final name = 'lynn';// name = 'lee lynn'; //运行出错,因为final修饰的变量不能调用其setter方法,即:不能设值// const:只能被设一次值,在声明处赋值,且值必须为编译时常量;用于修饰常量。const num = 123;// num = 234; 出现异常,const修饰的变量不能调用setter方法,即:不能设值,只能在声明处设值const atm = 1.01325 * num; // 值的表达式中的变量必须是编译时常量(num);var num1 = 12; // 定义一个非编译时常量// atm = 1 * num1 出错,因为 num1 不是一个编译时常量,即:非const修饰的变量(只有const修饰的变量才是编译时常量)
默认值
未初始化的变量默认值是 null。即使变量是数字 类型默认值也是 null,因为在 Dart 中一切都是对象,数字类型 也不例外。
