那些你不知道的Dart细节之变量(一)

简介: 在Dart中变量的声明有三个关键字:var、dynamic和Object,

前言

好久没写Flutter了,之前接触Flutter还是为了玩一玩,看着这样一个新的、好评如潮的跨平台技术,觉得是该玩一玩了,之前的RN就没玩就要凉了,毕竟RN不是Google的亲儿子,但是Flutter是啊,而且Dart也是啊。

未来的几篇文章准备写一个Flutter的专题,最起码要把之前忽略的一些细节都给补上。好了,废话不多说,下面直接开始。

那些你不知道的Dart细节之变量

那些你不知道的Dart细节之内置类型

那些你不知道的Dart细节之函数(方法)

那些你不知道的Dart细节之操作符、流程控制语句、异常

那些你不知道的Dart细节之类的点点滴滴

那些你不知道的Dart细节之泛型和库

Hello World

学习一门语言一般都要从打印“Hello World”开始,那么就来看一下在Dart中应该怎样打印:

void main(){
  print("Hello World");
}

和Java类似,Dart执行也需要一个main方法,打印就要比Java稍微简单点了,直接进行Print就可以了。这里需要注意的是:方法如果没有返回值的情况下可以省略void

变量的声明

真正要进入主题了。。。在Dart中变量的声明有三个关键字:var、dynamic和Object,三个关键字的使用情况各有千秋。下面来分别说一下:

var

首先说一下var关键字,了解过Kotlin的应该对这个关键字很熟悉,在Kotlin中var表示一个可变的变量(val表示不可变的,相当于final,这里不赘述),在Dart中,var如果没有初始值,可以变成任何类型,但如果var有初始值,那么类型将被锁定。这是什么意思呢?看一下下面这段代码你就明白了:

main(){
  //print("Hello World");
  var data;
  data = 'zhujiang';
  data = 123;
  print(data);
}

var在没有初始值的时候是可以随意指定类型的,例如上面的代码,可以赋值为字符串,也可以赋值为int。这里要注意:Dart中字符串可以使用单引号也可以使用双引号。

上面代码没有赋初始值,下面赋初始值再看一下:

main(){
  //print("Hello World");
  var data = 1;
  data = 'zhujiang';
  data = 123;
  print(data);
}

大家可以看到,如果有初始值,就不可以改变类型了,正好印证了上面我们所说的类型被锁定。

Object

这个关键字大家应该都很熟悉,Java中的所有对象的父类就是Object。在Dart中dynamic指动态类型,会在编译阶段检查类型。Object和var不同,即使赋了初始值,也同样可以指定别的类型:

Object data2 = 1234;
  data2 = 'dongnao';
  print(data2);

上面所说的会在编译阶段检查类型指的是如果你调用一个本身没有的方法,可以直接报红,提醒你编写错误(var也是在编译阶段检查类型)。

dynamic

我在学习Dart之前没有在别的语言见过这个关键字,对我而言比较陌生,这个关键字和Object非常相似,唯一的区别就是在编译阶段不检查类型。和Object恰恰相反,如果你调用一个本身没有的方法,不会报错,但是当你运行的时候才会抛异常。

变量的默认值

这个本来不想说的,但是发现和之前所学的不太一样,还是说一下吧。

在Dart中,没有初始化的变量自动获取一个默认值为null

一切皆对象,对象的默认值为null

只要记着上面两句话就可以了,不要被之前的Java所禁锢,比如之前的Boolean值默认会是false,但是在Dart中的bool值默认也是null,记着,一切皆对象,对象的默认值为null

变量 final和const

final大家很了解,Java中经常使用,const相对就比较陌生了,下面说一下他们的共同点:

声明的类型可省略

final fVariable1 = 'zhujiang';
//  final String fVariable1 = 'zhujiang';
  const cVariable1 = 'zhujiang';
//  const String cVariable1 = 'zhujiang';

初始化后不能再赋值

fVariable1 = 'demo';
cVariable1 = 'demo';

上面初始化之后,这里就不可以赋值了,如果赋值即会报错

不能和var同时使用

final var fVariable1 = 'zhujiang';
const var fVariable1 = 'zhujiang';

和var同时使用的话也会报错。

下面再看一下他们的不同点:

类级别常量,使用static const

static const int monday = 1;

这里大家可以参照一下系统中的类,例如DateTime。

const可使用其他const 常量的值来初始化其值

const width = 100;
const height = 100;
const square = width * height;

使用const赋值声明,const可省略

const List clist = [1, 2, 3];
//  const List clist = const [1, 2, 3];//dart 2之前,const赋值必须用const声明

可以更改非final、非const变量的值,即使曾经具有const值

var varList = const [1, 2, 3];
final finalList = const [1, 2, 3];
const constList = [1, 2, 3];
varList = [1];
//  constList = [1];
//  finalList = [1];

const导致的不可变性是可传递的

final List ls = [1, 2, 3];
  ls[1] = 4;
  print(ls);
  const List ls1 = [1, 2, 3];
//  ls1[1] = 4;

相同的const常量不会在内存中重复创建

final finalList1 = [1, 2];
  final finalList2 = [1, 2];
  print(identical(finalList1, finalList2)); //identical用于检查两个引用是否指向同一个对象
  const constList1 = [1, 2];
  const constList2 = [1, 2];
  print(identical(constList1, constList2)); 

上面代码的运行结果是false和ture,也印证了上面所说的。

const需要是编译时常量

final DateTime finalDateTime = DateTime.now();
  //  const DateTime constDateTime = DateTime.now();//DateTime.now() 是运行期计算出来的值

总结

本篇文章简单说明了在Dart中变量的一些细节问题,还有大家在编码过程中需要注意的问题。下一篇文章讲解一下Dart中的内置类型,希望大家能够喜欢

目录
相关文章
N..
|
6天前
|
Dart
Dart语言中类的定义和使用
Dart语言中类的定义和使用
N..
15 0
|
6天前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
53 0
|
6天前
|
Dart 安全 前端开发
【教程】混淆Dart 代码
代码混淆是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。
|
存储 缓存 Dart
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
类和成员的可见性,这在基于库或包的开发中非常重要,Dart中提供了工厂构造函数,可以方便的实现单例、缓存实例对象、返回子类等,以及常量构造函数的使用......
248 0
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
|
Dart
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
函数(Function)也被称为方法(Method)。其最直观的理解就是数据中的函数,比如y=f(x),在编程中,f对输入x进行处理,返回结果y,就是一个函数......
782 0
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
N..
|
6天前
|
自然语言处理 Dart 算法
Dart语言中函数的定义
Dart语言中函数的定义
N..
12 0
|
7月前
|
存储 Dart JavaScript
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
132 0
|
Dart Java Kotlin
那些你不知道的Dart细节之函数(方法)(三)
Dart中的函数,也就是方法
110 0
|
Dart Java 索引
那些你不知道的Dart细节之内置类型(二)
在Dart中,内置类型有以下几种:Numbers 数值、Strings 字符串、Booleans 布尔值、Lists 列表(数组)、Sets 集合、Maps 集合、Runes 符号字符、Symbols 标识符。
132 0