语言特性
Dart是面向对象设计
Dart是动态类型语言
Dart语言由:语言规范、虚拟机、类库、和工具等组成
SDK:SDK 包含 Dart VM、dart2js、Pub、库和工具。
```
Dartium:内嵌 Dart VM 的 Chromium ,可以在浏览器中直接执行 dart 代码。
Dart2js:将 Dart 代码编译为 JavaScript 的工具。
Dart Editor:基于 Eclipse 的全功能 IDE,并包含以上所有工具。支持代码补全、代码导航、快速修正、重构、调试等功能。
```
Dart中 类和接口是统一的
为提高运行速度,可以指定数据类型和编译时的常量
Dart提供类顶级函数,以变量 "_"开头意味着对它对lib是私有的
未初始化的变量 默认值为null
const命名 编译时的常量
实例变量可以是final,但不可以是const,final的值只能被设定一次
复制代码
基础
数据类型
```
// 1、num
// num 是数字类型的父类,有两个子类 int 和 double
// int 根据平台的不同,整数值不大于64位。在Dart VM上,值可以从-263到263 - 1,编译成JavaScript的Dart使用JavaScript代码,允许值从-253到253 - 1。
// double 64位(双精度)浮点数,如IEEE 754标准所规定
// 2、String
// Dart里面的String是一系列 UTF-16 代码单元。
// 您可以使用单引号或双引号来创建一个字符串。
// 单引号或者双引号里面嵌套使用引号。
// 用 或{} 来计算字符串中变量的值,需要注意的是如果是表达式需要${表达式}
// 3、bool
// Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true。
// 只有两个对象具有bool类型:true和false,它们都是编译时常量。
// Dart的类型安全意味着您不能使用 if(nonbooleanValue) 或 assert(nonbooleanValue) 等代码, 相反Dart使用的是显式的检查值。
// assert是语言内置的断言函数,仅在检查模式下有效在开发过程中, 除非条件为真,否则会引发异常。(断言失败则程序立刻终止)。
// List集合
// 在Dart中,数组是List对象,因此大多数人只是将它们称为List。
// Dart list文字看起来像JavaScript数组文字
// 可以直接打印list包括list的元素,list也是一个对象。但是java必须遍历才能打印list,直接打印是地址值。
// 和java一样list里面的元素必须保持类型一致,不一致就会报错。
// 和java一样list的角标从0开始。
// 如果集合里面有多个相同的元素“X”, 只会删除集合中第一个该元素
// Map集合
// 一般来说,map是将键和值相关联的对象。键和值都可以是任何类型的对象。
// 每个键只出现一次,但您可以多次使用相同的值。Dart支持map由map文字和map类型提供。
// 初始化Map方式一: 直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开。
// 创建Map方式二:先声明,再去赋值。
// map的key类型不一致也不会报错。
// 添加元素的时候,会按照你添加元素的顺序逐个加入到map里面,哪怕你的key,比如分别是 1,2,4,看起来有间隔,事实上添加到map的时候是{1:value,2:value,4:value} 这种形式。
```
复制代码
变量与常量
```
// 1、声明关键字
var
const
final
class
void
Object
String
int
// final、const
// final修饰的顶级变量或类变量在第一次声明的时候就需要初始化
// 被final或者const修饰的变量,变量类型可以省略,建议指定数据类型
// final 或 const 修饰的变量无法再去修改其值
// flnal 或者 const 不能和 var 同时使用
// 常量如果是类级别的,请使用 static const
// const关键字不只是声明常数变量,您也可以使用它来创建常量值,以及声明创建常量值的构造函数,任何变量都可以有一个常量值
// 在常量表达式中,该运算符的操作数必须为'bool'、'num'、'String'或'null', const常量必须用conat类型的值初始化
// 常量的运算
const speed = 100; //速度(km/h)
const double distance = 2.5 * speed; // 距离 = 时间 * 速度
final speed2 = 100; //速度(km/h)
final double distance2 = 2.5 * speed2; // 距离 = 时间 * 速度
//可以省略String这个类型声明
final name = "Bob";
final String name1 = "张三";
const name2 = "alex";
const String name3 = "李四";
// 2、默认值: 未初始化的变量 默认缺省值为null
int count
// 3、变量声明与初始化:没有明确类型,编译的时候根据值明确类型
var name = ‘Bob’;
Object name = 'James';
dynamic name = 'Curry';
// 显示声明将被推断类型, 可以使用String显示声明字符串类型
String name = 'Bob' ;
```
#### 运算符
```
```
#### 流程控制语句
```
// if...else
// for
// while do-whild
// break continue
// switch...case
// assert(仅在checked模式有效)
```
#### 异常(Exceptions)
```
// throw
// 抛出固定类型的异常
throw new FormatException('Expected at least 1 section');
// 抛出任意类型的异常
throw 'Out of llamas!';
// 因为抛出异常属于表达式,可以将throw语句放在=>语句中,或者其它可以出现表达式的地方
distanceTo(Point other) => throw new UnimplementedError();
// catch
// 将可能出现异常的代码放置到try语句中,可以通过 on语句来指定需要捕获的异常类型,使用catch来处理异常。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
// rethrow
// rethrow语句用来处理一个异常,同时希望这个异常能够被其它调用的部分使用。
final foo = '';
void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
rethrow;// 如果不重新抛出异常,main函数中的catch语句执行不到
}
}
void main() {
try {
misbehave();
} catch (e) {
print('3');
}
}
// finally
// Dart的finally用来执行那些无论异常是否发生都执行的操作。
final foo = '';
void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
}
}
void main() {
try {
misbehave();
} catch (e) {
print('3');
} finally {
print('4'); // 即使没有rethrow最终都会执行到
}
}
```
#### 函数
```
// main()函数
//每个应用程序都必须有一个顶层main()函数,它可以作为应用程序的入口点。该main()函数 具有List<String>参数的可选参数 返回void。
```
#### 级联符号 ..复制代码