文档章节

Dart 中final和const的使用详解

scooplol
 scooplol
发布于 2017/08/16 19:57
字数 662
阅读 407
收藏 0

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);
}

 

 

© 著作权归作者所有

scooplol
粉丝 17
博文 103
码字总数 205785
作品 0
南充
程序员
私信 提问
Dart的语法详解系列篇(二)-- 类与函数

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/44ae73a58ebc 转载请标明出处: https://www.jianshu.com/p/44ae73a58ebc 本文出自 AWeiLoveAndroid的博客...

AWeiLoveAndroid
2018/12/30
0
0
Flutter 之 Dart语言基础详解 上篇

经过了一个星期的React Native的学习和了解,感觉还是Flutter的优势会更高一些,而且从学习成本来说感觉做安卓的同学学习flutter会相对低一点,门槛会低很多。 当然dart的基础笔者还是从其他...

林-师傅等等我
03/22
45
0
Dart In Action -Dart快速入门(三)

写在前面 本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。 Flutter教程在这里 Final 和 const 如果您从不打算更改变量,请使用或,...

JarvanMo
2018/07/23
0
0
Dart 要想飞的高基础要打牢篇一(变量与操作符)

介绍 Dart是什么? Dart是一门新的编程语言,如同JAVA、PHP一样,是为了解决编写应用程序中的一些实际问题而被造轮子发明出来的,而这个造轮子的人就是 Google。可能大家都熟悉Google 的另一...

praise
07/29
0
0
Flutter学习笔记(3)--Dart变量与基本数据类型

如需转载,请注明出处:Flutter学习笔记(3)--Dart变量与基本数据类型 一.变量 在Dart里面,变量的声明使用var、Object或Dynamic关键字,如下所示: var name = ‘张三’; 在Dart语言里一切...

CurtisWgh
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
7
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部