Dart 中的类
在 Dart 中,所有对象都是某个类的实例,所有的类都隐式地继承自 Object 类。类是 Dart 面向对象编程的核心,用于封装数据和行为。
构造函数
构造函数用于初始化对象的状态。Dart 支持多种构造函数形式。
默认构造函数
import 'dart:math';
// 定义类
class Point {
num x = 0, y = 0;
// 命名构造器
// Point(this.x, this.y);
// 或者使用主体初始化
Point(x, y) {
this.x = x;
this.y = y;
print('这是构造函数,在实例化时触发');
}
// 实例方法
num distanceTo(Point other) {
var dx = x - other.x;
var dy = y - other.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
// 调用类的构造函数,new 关键字可以省略
Point p1 = new Point(1, 2); // 这是构造函数,在实例化时触发
Point p2 = Point(3, 4); // 这是构造函数,在实例化时触发
// 调用类方法
print(p1.distanceTo(p2)); // 输出:2.8284271247461903
}
空安全与字段初始化
由于 Dart 的空安全(Null Safety)特性,如果实例字段未显式初始化且没有默认值,必须在构造函数中进行赋值,否则报错。
以下写法会报错,因为编译器无法确定 x 和 y 是否被分配了变量:
class Point {
num x, y;
Point(x, y) { // 不可为空的实例字段 'x' 必须被初始化
this.x = x;
this.y = y;
}
}
解决方法:
- 提供默认值。
- 将类型声明为可空(
num?)。 - 在构造函数中使用字段初始化器。
示例:使用可空类型
class Point {
num? x, y;
Point(x, y) {
this.x = x;
this.y = y;
}
}
num? 表示可空类型,允许变量值为 null。
命名构造函数
使用命名构造函数可以为一个类实现多个构造函数,或者使代码语义更清晰。例如 DateTime.now() 就是命名构造函数。
重定向构造函数
使用冒号 : 调用其他构造函数,避免重复代码。
class Point {
num? x;
num? y;
// 命名构造函数
Point.initX(y) {
this.x = 2;
this.y = y;
}
// 重定向构造函数
Point.redirector(num x) : this(x, 0);
}
void main() {
Point p1 = Point.initX(2);
print('${p1.x}, ${p1.y}'); // 输出:2, 2
Point p2 = Point.redirector(1);
print('${p2.x}, ${p2.y}'); // 输出:1, 0
}
代码组织
随着代码量增加,建议将类抽离到单独的文件中,通过 import 导入库。
// lib/Point.dart
class Point {
num x = 0, y = 0;
Point(this.x, this.y);
}
// main.dart
import 'lib/Point.dart';
void main() {
// ... 使用 Point 类
}
类及成员可见性
Dart 中的可见性以库(library)为单位,每个 Dart 文件就是一个库。
- 使用
_前缀表示属性或方法是私有的,相当于 Java 中的 。


