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 中一切都是对象,数字类型 也不例外。