所有未初始化的变量都包含一个默认的初始值
null
,即便是数字类型
Dart声明包含明确声明和类型推导方式声明
1.明确声明(Explicit)
明确声明变量的方式, 格式如下:
变量类型 变量名称 = 赋值;
示例代码:
String name = '王子';
int age = 18;
double height = 1.80;
2.类型推导(Type Inference)
类型推导声明变量的方式, 格式如下:
var/dynamic/const/final 变量名称 = 赋值;
2.1.var的使用
var的使用示例:
- runtimeType用于获取变量当前的类型
var name = 'asuna';
name = 'kirito';
print(name.runtimeType); // String
2.1.1.先声明后赋值
类似于JavaScript中的var,用var声明的变量可以接收任何类型的变量,var声明的变量在第一次赋值是就确定类型,但是如果var声明没有马上赋值的情况下是可以赋值任何类型的值的,如下代码所示
main(List<String> args) {
var v;
v = '王子';
print(v);
v = 100;
print(v);
v = 6.66;
print(v);
v = true;
print(v);
}
运行结果如下:
王子
100
6.66
true
2.1.2.声明是马上赋值
需要注意的是如果var声明的变量在声明的同时马上赋值某一类型的值,那么该变量就固定该类型,不可再赋值其他类型的值,否则会报错,如下所示:
A value of type 'int' can't be assigned to a variable of type 'String'.
A value of type 'double' can't be assigned to a variable of type 'String'.
A value of type 'bool' can't be assigned to a variable of type 'String'.
3.dynamic的使用
在开发中, 通常情况下不使用dynamic, 因为类型的变量会带来潜在的危险 dynamic变量声明在先声明未马上赋值的情况下,与上面var声明的变量一样,可以赋任何类型的值,上面第一个示例中把var替换成dynamic后运行结果是一样的。 需要注意的是dynamic声明的变量若在声明的同时马上赋值,其类型还是动态的,并不会固定为赋值的类型。这一点和var声明的变量不一样。
main(List<String> args) {
dynamic v = '王子';
print(v);
v = 100;
print(v);
v = 6.66;
print(v);
v = true;
print(v);
}
运行结果如下,并不会报错
王子
100
6.66
true
4.final&const的使用
final和const都是用于定义常量的,也就是定义之后不可修改
final name = '王子';
name = 'kit'; //错误做法
const age = 18;
age = 20; //错误做法
4.1final和const的区别
- const在赋值时,赋值的内容必须是在编译期间就确定下来
- final在赋值时,可以动态获取。final一旦被赋值后就有确定的结果, 不会再次赋值。
String getName(){
return '王子';
}
main(){
const name = getName(); // 错误做法,因为要执行函数才能获取到值
final name = getName(); // 正确做法
}
const放在赋值语句的右边,可以共享对象,提高性能。
class Person{
const Persion();
}
main(List<String> args){
final a = const Person();
final b = const Person();
print(identical(a,b)); // true
final m = Person();
final n = Person();
print(identical(m,n)); // false
}