那些你不知道的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..
66 0
|
6月前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
79 0
|
存储 缓存 Dart
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
类和成员的可见性,这在基于库或包的开发中非常重要,Dart中提供了工厂构造函数,可以方便的实现单例、缓存实例对象、返回子类等,以及常量构造函数的使用......
303 0
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
|
Dart
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
函数(Function)也被称为方法(Method)。其最直观的理解就是数据中的函数,比如y=f(x),在编程中,f对输入x进行处理,返回结果y,就是一个函数......
1034 0
[Flutter]足够入门的Dart语言系列之函数:函数定义、调用、5种参数类型和main函数
|
5月前
|
Dart
Dart编程入门:main方法、变量、常量和注释
Dart编程入门:main方法、变量、常量和注释
N..
|
6月前
|
自然语言处理 Dart 算法
Dart语言中函数的定义
Dart语言中函数的定义
N..
47 0
|
存储 Dart JavaScript
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
【Dart语言解密】想要深入了解Dart语法和类型变量吗?
166 0
|
Dart 前端开发 JavaScript
dart中将方法当做参数传递时的注意事项
众所周知,Dart是一门面向对象的语言,比Java更纯粹,Dart中的方法也是对象,也有类型Function。这意味着方法可以被分配给对象,也可以当做参数传递给其他方法。
|
自然语言处理 Dart 算法
[Flutter]足够入门的Dart语言系列之函数:匿名函数、作用域闭包、类型别名和内联函数类型
函数在Dart中是对象,因此,可以将函数作为参数传递给另一个函数、作为一个'值'赋值给一个变量。下面主要介绍匿名函数、内联函数类型的使用,以及了解下作用域和闭包...
767 0
[Flutter]足够入门的Dart语言系列之函数:匿名函数、作用域闭包、类型别名和内联函数类型
|
Dart
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用
类表示的是分类,一类问题或事物,它是对具体或现实世界的抽象。比如动物类、犬科动物类、猫科动物类、房子类、数学类,类是具体事物的描述,它不是指具体的某个动物、某栋房子、某个数学题,而是对它们的概括...
336 0
[Flutter]足够入门的Dart语言系列之面向对象:类的定义详解、成员和实例使用