Dart关键字final和const

dart官网定义:
final和const
使用过程中从来不会被修改的变量, 可以使用 final 或 const, 而不是 var 或者其他类型, Final 变量的值只能被设置一次; Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型.) 最高级 final 变量或类变量在第一次使用时被初始化。

提示: 实例变量可以是 final 类型但不能是 const 类型。 必须在构造函数体执行之前初始化 final 实例变量 —— 在变量声明中,参数构造函数中或构造函数的初始化列表中进行初始化。

理解

这里先多说一嘴”编译时常量“和”运行时常量“
比如在java中,
public final static String name = ”test“;//编译时常量,在声明变量赋值,并且不依赖运行时的类状态
public final static int length = ”test“.length();//运行时常量,依赖运行时的类状态

final:只能被设一次值,在声明处赋值,值和普通变量的设值一样,可以是对象、字符串、数字等,用于修饰值的表达式不变的变量;

final int a = 1;
a = 2;//编译报错 The final variable 'a' can only be set once
String name = "aaa";
final int b = 2 * name.length;//编译成功  运行时常量

const:只能被设一次值,在声明处赋值,且值必须为编译时常量;用于修饰常量。

const int a = 1;//编译成功
const int a = 2 * 3;//编译成功
String name = "aaa';
const int b = 3 * name.length;//编译报错 Const variables must be initialized with a constant value.

const还可以用来声明常量值

var a = const[];// const[]创建一个空数组,a就是一个空数组。是可以再次赋值的
final b = const[];//被final修饰,那么就不能再次被赋值了
const c = const[];//直接是编译时常量了
注意:a = [3,3,3]; //编译成功 运行成功

final修饰的基本类型是值不能被修改,但是修饰的是引用类型,比如数组,集合,map,是可以改变里面的内容,const不行

final a = [1];
a[0] = 3;//编译成功
const b = [3];
b[0] = 4;//编译成功,运行报错  Unsupported operation: Cannot modify an unmodifiable list

你可能感兴趣的:(Dart关键字final和const)