一、常量声明
const
使用const 定义的常量是不可变的(就是在编译期就必须确定好的固定值), 需要定义并赋值,常量定义的集合,都是只读的,特性是所赋值会传递到子元素,在内存中会复用相同内容对象,const特性与ES6中的类似。
const PI = 3.1454567;
const ARY = [1,2,3,4,5];
var ARRY = const[1,2,3,5];
final
使用final 定义的变量, 只能赋值一次;并且在运行时赋值,所谓运行时,就是当程序执行到这块代码时才会对final修饰的变量进行赋值。可以是对象、字符串、数字等
final SCORE = 123;
二、与Java的比较
java中定义常量:
final static float DEX = 0.5;
如果常量定义的是基本数据类型(int、double),在dart中不需要定义变量的类型,dart会根据赋值的情况推导类型,如果加上var就会报错。
三、const与final的区别
const a = [1,2,3,4,5];
a[1] = 10;
print(a[1]);
如上代码运行会直接报错。上面一中说到赋值会传递到子元素,就是指这个。而final,修饰的则可以直接修改。
Unhandled exception: Unsupported operation: Cannot modify an unmodifiable list #0 UnmodifiableListMixin.[]= (dart:_internal/list.dart:90:5) #1 main (package:flutter_demo/dartEx.dart:39:4) #2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19) #3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
四、比较
const a = [1,2,3,4];
var b = const[1,2,3,4];
print(identical(a, b)); //true
const a = [1,2,3,4];
const b = [1,2,3,4];
print(identical(a, b)); //true
五、总结
const和final在dart中不可以修饰类
const和final声明的类型均可省略
const和final初始化不能再赋值
const和final都不能和var同时使用
类级别的常量使用static const
创建相同的const对象在内存中会被共用
const的不变性是可传递的(传递至集合的子元素),而final则不会
const常量需要使用const常量进行定义,比如如下方式就不可
用var定义的const数组是可以重新赋值,而const和final定义的就不行,如下:
const定义时,必须是编译时常量,比如const datetime = DateTime.now();这么写就会报错
使用const定义一个数组时,后面的const可以省略,比如
const a = const[1,2,3]; const b = [1,2,3];
const构造器,这个类中所有的属性必须是final修饰
const可以修饰widget对象