Dart 中final和const的使用详解 原

1.基本使用

如果变量的值不发生变化,那么可以使用 final 或 const 修饰,

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

final name = 'Bob';   
// name = 'job'; //运行出错,因为final修饰的变量不能调用其setter方法,即:不能设值

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

const bar = 1000000;       // 定义常量值
// bar =13;   // 出现异常,const修饰的变量不能调用setter方法,即:不能设值,只能在声明处设值
const atm = 1.01325 * bar; // 值的表达式中的变量必须是编译时常量(bar);

var c = 12;        

//  atm = 1 * c;  //出错,因为c不是一个编译时常量,即:非const修饰的变量(只有const修饰的变量才是编译时常量)

----const还可以用来声明常量值:

// [] 创建一个空列表.
// const [] 创建一个空的不可变列表 (EIA).
var foo = const [];   // foo 目前是一个 EIA.
final bar = const []; // bar 永远是一个 EIA.
const baz = const []; // baz 是一个编译时常量 EIA.

//你可以改变 非final, 非const 修饰的变量,
// 即使它的值为编译时常量值.
foo = [];

// 不能改变final和const修饰的变量的值.
// bar = []; // 未处理的异常.
// baz = []; // 未处理的异常.

2.高级使用

----当为final修饰的值赋一个包含成员变量或方法的对象时:

     --------1.  对象成员值能被修改,对于能够添加成员的类(如List、Map)则可以添加或删除成员

     --------2. 变量本身实例不能被修改

class Point{
  var x,y;
  Point(this.x,this.y){
    
  }
}

main() {
   final  p = new Point(1,2); 
   // p = new Point(3,4);   //出错,final修饰的变量不能调用setter方法;
      p.x=2;    // 正常执行,修改的是变量的属性值,而不是变量引用的对象;
      print(''p.x);  // 打印 2


  var foo = const [];  
    foo = [1,2,1];  
    /*此部分代码的重点在于var foo , 一个正常变量可以随意赋值或更改,重点不在const [],
      所以不要纠结const []是不可变的。[]和[1,2,1]是不同的对象*/
    print(foo);   

 
 final baz =  [1];
 // baz=[1,2,3,4]; //出错 此调用修改了变量的实例 即:[1] 和[1,2,3,4]是不同的对象
    baz[0]=2;     //正常执行,只修改了变量引用对象的成员变量的值
    print(baz); 

 final bad =  [];   //List<int>
    bad.add(1);    //正常执行,向变量引用对象添加成员
    bad.add(2); 
    print(bad)

 final Map<String, String> cache = <String, String>{};  //Map
   cache['name1']='1213';
   cache['name2']='1313';
   print(cache);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏赵俊的Java专栏

合并排序数组

34210
来自专栏子勰随笔

Java参数引用传递引发的惨案(又一次Java的String的“非对象”特性的踩坑经历)

31860
来自专栏mathor

1小时入门c++面向对象编程

这篇文章只适用于有 C 或 C++ 基础的人看,没有基础建议先去了解一下基础知识,我会结合之前我上课老师讲的内容,以及我自己的理解,有的放矢的讲,而且绝对不会掺...

10110
来自专栏小勇DW3

Java之static作用的全方位总结

 引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,...

24920
来自专栏Ryan Miao

java中遇到过的String的一些特性

1.string对象是final的? 1 String str="asdfdf"; 2 str.replace("as",""); 3 System.out.p...

36690
来自专栏java学习

Java每日一练(2017/9/2)

本期题目: (单选题)1、如果int x=20, y=5,则语句System.out.println(x+y+""+(x+y)+y); 的输出结果是() A...

36970
来自专栏mathor

泛型

23470
来自专栏GopherCoder

Python 强化训练:第七篇

15140
来自专栏鸿的学习笔记

介绍Scala的样例类

在Scala里存在样例类。它的意义是为了减少重复代码,预先给类定义一些常用的方法。在Scala里使用case关键字来描述样例类。

7520
来自专栏猿人谷

标准库类型

一.标准string类型     string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。 1.1 strin...

20780

扫码关注云+社区

领取腾讯云代金券