重要概念
Dart中所有变量都是基于类的:
所有变量引用的都是对象
,每个对象都是一个类
的实例。数字
、函数
以及null
都是对象。除了null
以外(如果你开启了空安全), 所有的类都继承于Object
类。
当你在学习 Dart 语言时, 还应该牢记以下几点:
- 尽管 Dart 是强类型语言,但是在声明变量时指定类型是可选的,因为 Dart 可以进行类型推断。在之前的示例代码中,变量
number
的类型被推断为int
类型。
void main() {
// number变量被推断为int类型
var number = 2;
// str变量被推断为String类型
var str = 'abc';
}
- 如果你开启了 空安全,变量在未声明为可空类型时不能为
null
。你可以通过在类型后加上问号 (?
) 将类型声明为可空。例如,int?
类型的变量可以是整形数字或null
。如果你明确知道一个表达式不会为空,但 Dart 不这么认为时,你可以在表达式后添加 ! 来断言表达式不为空(为空时将抛出异常)。例如:int x = nullableButNotNullInt
!
void main() {
// 开启空安全(默认开启)时,使用?标识符可以对变量赋值null
int? test;
test = null;
test = 123;
}
- 如果你想要显式地声明允许任意类型,使用
Object?
(如果你开启了空安全)、Object
或者特殊类型dynamic
(将检查延迟到运行时进行)。
void main() {
// 以下三种均为任意类型变量的声明示例
// 使用Object声明的变量可以是任意非空类型
Object any2 = true;
any2 = 123;
// 在开启空安全时,除非使用了?标识符,否则变量不可为空(null)
Object? any = null;
any = 1;
any = 'abc';
// dynamic将在运行时在判断变量类型
dynamic any3 = '123';
any3 = 3.2;
print('any: $any, any2: $any2, any3: $any3');
}
- Dart 支持泛型,比如
List<int>
(表示一组由int
对象组成的列表)或List<Object>
(表示一组由任何类型对象组成的列表)。
void main() {
// 指定类型int
List<int> numberArr = [1, 2];
// 任意非空类型
List<Object> anyArr = [1, 'a', false];
// Object?可包含null
List<Object?> allArr = [1.3, 'b', null];
print('$numberArr, $anyArr, $allArr');
}
- Dart 支持顶级函数(例如
main
方法),同时还支持定义属于类或对象的函数(即静态和实例方法)。你还可以在函数中定义函数(嵌套或局部函数)。
// 顶级函数,定义在main函数以外,可在任意位置被调用
void testFunc(){
// 嵌套或局部函数,只能在定义它的testFunc函数中被调用
int testFunc2(){
return 2;
}
print(testFunc2());
}
void main() {
testFunc();
}
- Dart 支持顶级变量,以及定义属于类或对象的变量(静态和实例变量)。实例变量有时称之为域或属性。
// 顶级变量,定义在main函数以外,可在任意位置被访问
int globalNum = 123;
void testFunc(){
print(globalNum);
}
void main() {
testFunc();
print(globalNum);
}
- Dart 没有类似于 Java 那样的 public、protected 和 private 成员访问限定符。如果一个标识符以下划线 (_) 开头则表示该标识符在库内是私有的(每个 Dart 程序都是一个库)。可以查阅
库和可见性
获取更多相关信息。
// 以 _ 开头表示_privateVar是当前库的私有变量
int _privateVar = 1;
- 标识符 可以以字母或者下划线 (_) 开头,其后可跟字符和数字的组合。
void main() {
// 以字母开头
var elemA1 = 123;
// 以下划线开头
var _elemA2 = 'abc';
}
- Dart 中
表达式
和语句
是有区别的,表达式有值而语句没有。比如条件表达式expression condition ? expr1 : expr2
中含有值expr1
或expr2
。与if-else
分支语句相比,if-else
分支语句则没有值。一个语句通常包含一个或多个表达式,但是一个表达式不能只包含一个语句。
void main() {
// 条件表达式含有值 2 和 'a',可用变量接收
var number = 1==1 ? 2: 'a';
print(number);
// if-else 语句则没有值,不可用变量接收
if (1 == 1) {
print(2);
} else {
print('a');
}
}
- Dart 工具可以显示
警告
和错误
两种类型的问题。警告表明代码可能有问题但不会阻止其运行。错误分为编译时错误
和运行时错误
;编译时错误代码无法运行;运行时错误会在代码运行时导致异常。
关键字
下面的表格中列出了 Dart 语言使用的关键字。
应该避免使用这些单词作为标识符。但是,带有上标的单词可以在必要的情况下作为标识符:
-
带有上标 1 的关键字为 上下文关键字,只有在特定的场景才有意义,它们可以在任何地方作为有效的标识符。
-
带有上标 2 的关键字为 内置标识符,这些关键字在大多数时候都可以作为有效的标识符,但是它们不能用作类名或者类型名或者作为导入前缀使用。
-
带有上标 3 的关键字为 Dart 1.0 发布后用于 支持异步 相关内容。不能在由关键字
async
、async*
或sync*
标识的方法体中使用await
或yield
作为标识符。
其它没有上标的关键字为 保留字,均不能用作标识符。