
3.2 变量与常量
在程序中,经常用大量的数据来代表程序的状态,其中有些数据的值在程序运行过程中会发生改变,有些数据的值不能发生改变,这些数据在程序中分别叫作变量和常量。
3.2.1 变量
所谓变量,就是用来储存值的对象,它可能是一个整数,也可能是一段话,其值通过变量名来访问。在Dart编程语言中,声明一个变量的方法非常简单。比如,要保存一个值为David的名字,操作如下:

在读取它时,仅仅按照name这个变量名去获取值即可。
现在,使用Dart内置的Print()方法向控制台输出名为name的变量值,代码片段如下:

运行结果如下:

在这个例子中,name储存了一个字符串数据对象的引用,值为David。当然,也可以直接使用String(字符串)类型或dynamic(动态)类型,而不是用var来对name进行声明。具体做法如下:

或者:

对于局部变量(指仅拥有局部作用域的变量,如一个方法内部)而言,根据代码建议的风格,建议使用var来声明变量。
在前文中提到,在Dart中一切皆对象。因此,未经初始化的变量的默认值为null。使用如下代码测试:

运行结果如下:

3.2.2 常量
常量,也称为最终变量。简单地说,一旦一个对象成了常量,其引用的对象就不再可变。在Dart语言中,可使用final或const关键字来声明一个常量。如下所示:

或者

或许有人会产生疑问:final和const都可用来声明一个常量,有什么区别呢?const声明的常量是一种编译时常量,如下:

从上面代码中可以发现,IDE会自动检查出在buyTwo值中的错误,因为const是一种编译时常量(即在运行前),所以同样需要用const来声明singlePrice。
const关键字也可以用来创建不变的值,甚至定义构造函数为const类型,即不可变对象,且任意变量都可以有一个不变的值。代码片段如下:

创建的intList变量的值为一个常量值(中括号表示一个数组)。虽然intList的值为常量不可变,但由于其本身声明使用了var,因此它仍然可以改变其引用。上述代码相当于:
