总目录
Flutter开发指南之理论篇:Dart语法01(数据类型,变量,函数)
Flutter开发指南之理论篇:Dart语法02(运算符,循环,异常)
Flutter开发指南之理论篇:Dart语法03(类,泛型)
Flutter开发指南之理论篇:Dart语法04(库,异步,正则表达式)
Dart是一门面向对象语言,它针对web 和移动设备开发进行了优化,主要特点为:
- 一切皆对象!无论是数字,函数还是null,所有对象继承自Object类;
- 声明一个变量时可以不指定具体类型,Dart可以自动推断类型;
- Dart支持顶层函数,函数是一等对象,且函数可作为参数传递;
- Dart使用
_
开头表示私有属性,没有关键字public
,protected
和private
;
1. 类
1.1 类的定义
Dart是一种基于类
和mixin
继承机制的面向对象的语言,每个对象都是一个类的实例,所有的类都继承于 Object。基于Mixin继承意味着每个类(除Object外
)都只有一个超类,一个类中的代码可以在其他多个继承类中重复使用。定义一个类大体形式如下:
class 类名 {
// 成员变量
类型 变量名;
// 构造函数(方法)
类名([参数1,..]) {
}
// 成员函数(方法)
类型 方法名([参数1,...]) {
}
}
从类定义可知,Dart中的类创建形式同Java一致。
1.1.1 构造函数
构造函数主要用于创建一个类的对象(实例),通常使用new
关键字实现,但是在Dart中该关键字可以省略。在没有声明构造函数的情况下,Dart会提供一个默认的构造函数,并且默认构造函数没有参数,会自动调用父类的无参构造函数。需要注意的是,子类不会继承父类的构造函数。举个例子:
class PersonalInfoBean {
// 成员变量
// 当声明时没有初始化,Dart会自动设置其初始值为null
String name;
num age;
var sex = 'male';
// 构造函数(带参数)
// this关键字可省略
PersonalInfoBean(String name, num age, var sex) {
this.name = name;
this.age = age;
this.sex = sex
}
// 【dart语法糖】
// 精简构造函数,因此上述构造函数等价于
// PersonalInfoBean(this.name, this.age, this.sex);
}
需要注意的是,dart中所有实例变量都生成隐式getter方法,非final的实例变量同样会生成隐式setter方法。因此,在调用类对象的成员变量时,最终会调用变量的getter或setter方法获取更新值。特别的,dart支持使用使用 ?.
来代替.
访问类对象的成员,可以避免因为左边对象可能为null,进而导致的异常。
// 使用无参构造函数
val personalInfo = PersonalInfoBean();
print('name = ${
personalInfo.name}'); // 打印 "name = null"
print('name = ${
personalInfo.sex}'); // 打印 "name = male"
personalInfo.name = 'jiangdg';
print('name = ${
personalInfo.name}'); // 打印 "name = jiangdg"
// 使用有参构造函数
val personalInfo2 = PersonalInfoBean('JJ', 45, 'female');
print('name = ${
personalInfo.name}'); // 打印 "name = JJ"
print('name = ${
personalInfo.sex}'); // 打印 "name = 45"
除了常规方式,Dart还支持几种特殊的构造函数:
- 命名构造函数
使用命名构造函数可为一个类实现多个构造函数,也可以使用命名构造函数来更清晰的表明函数意图。注意,由于构造函数不能被继承,这就意味着命名构造函数不会被子类继承,如果希望使用父类中定义的命名构造函数创建子类,就必须在子类中实现(重写)该构造函数。示例如下:
class Point {
// dart使用_表示私有属性
num _x, _y;
Point(this.x, this.y);
// 命名构造函数
Point.origin() {
x = 0;
y = 0;
}
}
// 使用命名构造函数
// 实例化一个对象
val originPoint = Point.origin();
print('x = ${
originPoint.x}'); // 打印 "x = 0"
print('y = ${
originPoint.y}')