前言
Dart既属于动态类型语言又属于静态类型语言,因此具有动态语言和静态语言的特性,这意味着在编程时可以根据需要进行选择显式声明和隐式声明。显式声明比较好理解,就是在编写代码时需要确定变量的类型,而隐式声明则不需要编写代码时给定,而是由编译器在运行时自动推断出变量的类型。
一、变量
1.1 变量的定义
变量可理解为存储数据的一个容器。由一个名称和数据类型组成,其值可以在程序运行时不断地更改与赋值。
1.2 变量的特点
变量包括命名规则、内存限制、可变性、及作用域与生命周期。这样一看比较晦涩难懂,我们来先看一张图片。
你没有看错,这就是超市的储物柜。它和变量的特点有什么关系呢?
让我们一起来联系一下:
储物柜是一个存储物品的箱子,而变量是一个存储数据的容器。是不是觉得有联系啦?我们一起来看一看是不是这么一回事。
- 命名规则: 储物柜上面都有一个唯一的标识,也就是它的号码。这个号码的命名好像有一定规则(都是按照数字排序的),回到我们的变量,变量一样的也拥有自己的一套命名规则(标识符命名规则)。
- 内存限制: 看到这个储物柜了吗?它好像只能放一些比较小的物品,放置过大的物品则放不下,存储空间限制了它不能存放的物品。变量也是拥有这样的限制(内存限制),变量受限于数据类型,如果你放置一个超过数据类型范围的数值可能会引发一些问题,因此我们需要特别关注变量的内存限制,注意数据类型的取值范围。
- 可变性: 储物柜在空间允许的情况下可以放置各种各样的物品,如书籍、包包等,放置的东西是变化的,可以根据需要进行更改放置的种类。变量亦同,可以进行更改其内容,或重新放置内容。
- 作用域和生命周期: 储物柜也不能一直使用,从它的开始使用的那天起,直到它不再被使用的那天。这就是储物柜的作用域,储物柜的生命周期。变量的作用域就是变量的作用范围,变量的生命周期就是变量从创建到销毁不再使用的过程。
1.3 声明及初始化
1.3.1 显示声明
数据类型+变量名
示例:
void main() {
int a = 10;
double b = 23.4;
String s = 'hello,Dart!';
}
1.3.2 隐式声明
由编译器在运行时自动推断出变量的类型。
1.3.2.1 var
- 声明变量,在编译时自动推断出其类型。
- 当推断出类型后,其类型不可再更改。
- 编译时检查。
- 只推断一次。
- 适用场景: 不能确定变量类型时使用。
示例:
1.3.2.2 dynamic
- 声明变量,在运行时自动推断出其类型。
- 运行时检查,编译时不检查。
- 适用场景: 声明时不能确定变量类型时和需要在运行时进行检查的变量声明。
示例:
1.3.2.3 final
- 声明不可变的变量,在运行时自动推断出其类型。
- 可以先声明,后初始化。
- 运行时检查,编译时不检查。
- 适用场景: 声明变量并初始化后不再赋值。
示例:
1.3.2.4 const
- 声明编译时常量,可隐式声明,隐式声明时自动推断出其类型
- 声明的同时必须进行初始化。
- 编译时检查。
- 适用场景: 声明常量时。
示例:
1.3.2.5 late
- 声明非空变量;
- 延迟初始化
- 运行时检查,不初始化就使用会报错。
- 适用场景: 延迟初始化非空变量的场景。
示例:
运行时报错。
二、常量
2.1 常量的定义
常量是一种特殊的变量,赋值后在程序运行过程中不会改变。
2.2 常量的特点
2.2.1 命名规则
- 大写字母加下划线;
- 例如:MAX_LENGTH;
2.2.2 不可变性
- 常量一旦声明,并初始化后常量的值不会更改。
2.3 常量的声明与初始化
使用const与final声明。
- const:编译时常量。
- final:运行时终量。
三、全局变量与局部变量
-
全局变量:
- 在整个程序运行期间都可见。
- 在整个程序运行期间都存在。
-
局部变量:
- 在函数或代码块中可见。
- 在函数或代码块进入时创建,在函数或代码块退出时销毁。
四、总结
本小节首先通过超市储物柜的例子来介绍变量的定义与特点,其次介绍了变量的声明与初始化,然后介绍了一种特殊的变量——常量,最后简单介绍了全局变量与局部变量。