1. 概述
- Dart是Google发布的一门编程语言
- Dart可用于全平台开发,主要用于跨平台移动端开发(Flutter)
- Dart是一门面向对象语言
2 变量和常量
为了可以尽快熟悉 DartPad,你可以尝试在 DartPad 中运行一些示例,然后在 DartPad 中创建一个简单的命令行应用。
2.1 变量
- 变量:使用var声明变量,可赋予不同类型的值;
- 未初始化时,默认值为null;
- 使用final声明的变量必须初始化,而只能只能赋值一次;
如上图所示
- 用var声明变量a,打印出null,然后又被赋予10和'Hello Dart';
- 用final声明变量c=30,当再赋值'Dart'时,编译器报错;
2.2 常量
- 使用const声明常量;
- 使用const声明的必须是编译期常量,即编译阶段就能确定它的值;
- 使用const声明的常量必须初始化,而且只能赋值一次;
3 数据类型
Dart的内置数据类型有
- 数值型-num
- 字符串-String
- 布尔型-bool
- 列表-List
- 键值对-Map
- Runes、Symbols (几乎用不到)
3.1 数值型-num
num有两种类型:
- 整型-int
- 浮点型-double
如上图所示:
- 声明变量a为num,a又可以赋值为10.1,所以num变量可以在整型和浮点型之间切换
- 声明变量b为int,b不可以赋值为1.1;声明变量c为double,c不可以赋值为2,所以如果一个变量被赋值为int或double,这个变量是无法改变类型的。
数值型操作有以下几种:
- 运算符:+、-、*、/、~/(取整)、%
- 常用属性:isNaN、isEven、isOdd等
- 常用方法:abs()、rount()、floor()等
3.1 字符串-String
字符串创建:
- 使用单引号、双引号创建字符串
- 使用三个单引号或双引号创建多行字符串
- 使用r创建原始字符串,不对\n等转义字符串进行转义
字符串操作:
- 运算符: +、*、==、[]
- 插值表达式:${表达式}
- 常用属性:length、isEmpty、isNotEmpty
- 常用方法: contains()、subString()等
3.2 布尔型-bool
- 使用bool表示布尔型
- 布尔值只有true和false
3.3 列表-List
创建:
- 创建List: var list = [1, 2, 3];
- 创建不可变的List:var list = const [1,2,3];
- 构造创建:var list = new List();
- 不写泛型的时候,list的元素可以是不同类型的;
操作:
- [],length,add(),insert(),remove(),clear()等等
3.4 键值对-Map
创建:
- 创建Map:var lan = {"first": "dart", "second": "java"};
- 创建不可变Map: var lan = const {"first": "dart", "second": "java"};
- 构造创建: var lan = new Lan();
操作:
- [],length,keys,values等;
3.5 dynamic
- dynamic相当于java中的Object类
如上图所示
- dynamic表示动态的意思,所以a可以赋值为num,也可以修改为String类型
- 在List中,dynamic相当于Java中的Object,但是Java中的List只能存放相同类型的元素,Dart的List中可以放入不同类型的元素
4 运算符
4.1 算术运算符
- +、 -、 *、 /、 ~/、 %
- ++i、 i++、 --i、 i--
4.2 关系运算符
- ==、!=、>、<、 >=、 <=
- 判断内容相等使用==
4.3 逻辑运算符
- !、&&、 ||
- 针对布尔类型运算
4.4 赋值运算符
- 基础运算符: =、??= (先判断变量是否为null,如果为null则赋值)
- 复合运算符: +=、-=、*=、/=、%=、~/=
4.5 条件表达式
- 三目运算符:condition? expr1 : expr2
- ??运算符:expr1 ?? expr2
5 控制语句
5.1 条件语句
- if
- if ... else if
- if ... else if ... else
5.2 循环语句
- for
- for ... in
- while
- do ... while
5.3 break和continue
- 终止循环:break
- 跳出当前循环:continue
5.4 switch...case
- 比较类型:num,String,编译器常量,对象,枚举
- 非空case必须有一个break
- 使用default处理默认情况
- continue跳转标签
6 方法
6.1 方法定义
返回类型 方法名(参数1, 参数2, ...){
方法体
return 返回值
}
-
方法也是对象,并且有具体类型的Function
-
返回值类型、参数类型都可以省略
-
箭头语法: => expr 是 {return expr;}的缩写。只适用于一个表达式
-
方法都有返回值。如果没有指定,默认return null 最后一句执行
6.2 可选参数
- 基于命名的可选参数: {param1, param2,...},传参时必须填写参数名:参数值
- 基于位置的可选参数: [param1, param2,...],传参是直接填写参数值
- 如果存在固定参数,可选参数必须在固定参数后面
6.3 默认参数值
- 使用 = 在可选参数指定默认值
- 默认值只能是编译时常量
6.4 方法对象
- 方法可以作为对象赋值给其他变量
- 方法可以作为参数传递给其他方法
6.5 匿名方法
(param1, param2, ...) {
...
return value;
}
-
可以赋值给变量,通过变量进行调用
-
可以在其它方法中直接调用或传递给其它方法
6.6 闭包
- 闭包是一个方法
- 闭包定义在其它方法内部的方法
- 闭包能访问外部方法内的局部变量,并持有其状态
- 如上图所示,printCount就是一个闭包
7 面向对象
7.1 类与对象
- 使用class声明一个类
- 使用关键字new创建一个对象,new可以省略
- 所有对象都继承于Object类
- 属性默认会生成getter和setter方法
- 使用final声明的属性只有getter方法
- 方法不能被重载
- 默认情况下,每个Dart文件就是一个库
- 使用_表示库的私有性
- 使用import导入库
7.2 计算属性
- 计算属性的值是通过计算而来,本身不存储值
- 计算属性赋值,其实是通过计算转换到其它实例变量
7.3 构造方法
- 如果没有自定义构造方法,会有默认的构造方法
- 如果存在自定义构造方法,默认构造方法无效
- 构造方法不能重载
- 如果想使用多个构造方法,需要使用命名构造方法
- 使用类名.方法的形式实现
7.4 常量构造方法
- 如果类是不可变状态(必须初始化,且只能被设置一次),可以把对象定义为编译时常量
- 使用const声明构造方法,并且所有变量都为final
- 使用const声明对象,可以省略
7.5 工厂构造方法
- 类似于工厂模式
- 在构造方法前添加factory实现一个工厂构造方法
- 在工厂构造方法中返回对象
7.6 初始化列表
- 初始化列表在构造方法体执行之前执行
- 使用逗号分隔初始化表达式
- 初始化列表常常用于设置final变量的值
7.7 静态成员
- 使用static关键字来实现类级别的变量和函数
- 静态成员不能访问非静态成员,非静态成员可以访问静态成员
- 类中的常量需要使用static const声明
7.8 对象操作符
- ?.表示前面对象为空就不往下执行了
- 类型转换 as
- 是否指定类型:is,is!
- 级联操作:..
7.9 对象call方法
- 如果类实现了call方法,则该类的对象可以作为方法来使用
7.10 继承
- 使用extends继承
- 子类会继承父类可见的属性和方法,不会继承构造方法
- 子类能复写父类的方法
- 单继承、多态性
7.11 继承中的构造方法
- 子类的构造方法默认会调用父类的无名无参的构造方法
- 如果父类没有无名无参构造方法,则需要显式调用父类构造方法
- 在构造方法参数后使用:显式调用父类构造方法
- 父类的构造方法在子类构造方法执行之前的位置调用
- 如果有初始化列表,初始化列表会在父类构造方法之前执行
7.12 抽象类
- 抽象类使用abstract表示,不能直接被实例化
- 抽象方法不用abstract修饰,无实现
- 抽象类可以没有抽象方法
- 有抽象方法的类一定要声明为抽象类
7.13 接口
- 类和接口是统一的,类就是接口
- 每个类都隐式的定义了一个包含所有实例成员的接口
- 如果复用已有类的实现,使用extends
- 如果只是使用已有类的外在行为,使用implements
7.14 Mixins
- Mixins类似于多继承,是在多类继承中重用一个类代码的方式
- 使用关键字with
- 作为Mixins的类不能有显式构造方法
- 作为Mixin的类只能继承自Object
7.15 操作符覆写
- 复写操作符需要在类中定义
- 如果需要复写==,还需要复写对象的hashcode getter方法,和Java相同
Type operator 操作符(param1, param2,...) {
...
return value
}
以下操作符可以复写:
8 枚举和泛型
8.1 枚举
- 一种有穷序列集的数据类型
- 使用关键字enum定义一个枚举
- 常用于代替常量,用于控制语句中
- index从0开始,依次累加
- 不能指定原始值
- 不能添加方法
8.2 泛型
- Dart中类型是可选的,可使用泛型来限定类型
- 使用泛型能有效减少代码重复
- 和Java一样,可以在类和方法上使用泛型