实例成员与静态成员
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 17 课,共 110 课。
在 Dart 类中,成员(变量和方法)可以属于单个对象,也可以属于类本身。理解这一区别是有效组织代码的基础。
实例成员属于你创建的每个对象。每个对象都有自己的实例变量副本,实例方法会操作该对象自己的数据:
class Dog {
String name; // 实例变量
Dog(this.name);
void bark() { // 实例方法
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy 汪汪叫!
dog2.bark(); // Max 汪汪叫!每个 Dog 对象都有自己的 name。更改一只狗的名字不会影响另一只狗。
静态成员属于类本身,而不属于任何特定对象。所有实例共享这些成员,并通过类名访问:
class Dog {
String name;
static int totalDogs = 0; // 静态变量
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2totalDogs变量是共享的,不管有多少个Dog对象,都只有一份。你通过类名Dog.totalDogs访问它,而不是通过实例访问。
挑战
简单我们来为博物馆构建一个访客计数系统,跟踪每个展览的参观次数和博物馆的整体统计数据。
你会将代码分成两个文件:
exhibit.dart:定义一个表示博物馆展览的Exhibit类。每个展览应包含:- 一个实例变量
name(String),用于保存展览名称 - 一个初始值为
0的实例变量visitorCount(int),用于跟踪参观这个展览的人数 - 一个初始值为
0的静态变量totalVisitors(int),用于跟踪所有展览的总参观次数 - 一个接收展览名称的构造函数
- 一个
recordVisit()方法,同时递增展览的visitorCount和类的totalVisitors - 一个用于打印展览信息的
displayStats()方法
- 一个实例变量
main.dart:导入展览类,并创建两个展览:- 一个
'Dinosaur Bones'展览 - 一个
'Ancient Egypt'展览
displayStats(),然后打印所有展览的总参观人数。- 一个
displayStats() 方法应按以下准确格式打印:
[name]: [visitorCount] visitors总参观人数这一行应打印:
Total museum visitors: [totalVisitors]使用类名 Exhibit.totalVisitors 访问静态变量。
预期输出:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5亲手试试
import 'exhibit.dart';
void main() {
// TODO: 创建一个 'Dinosaur Bones' 展品
// TODO: 创建一个 'Ancient Egypt' 展品
// TODO: 为 Dinosaur Bones 展品记录 3 次参观
// TODO: 为 Ancient Egypt 展品记录 2 次参观
// TODO: 依次对每个展品调用 displayStats()
// TODO: 使用 Exhibit.totalVisitors 输出博物馆参观总人数
// 格式:Total museum visitors: [totalVisitors]
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器