Menu
CoddyTech

实例成员与静态成员

本课属于 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);  // 2

totalDogs变量是共享的,不管有多少个Dog对象,都只有一份。你通过类名Dog.totalDogs访问它,而不是通过实例访问。

challenge icon

挑战

简单

我们来为博物馆构建一个访客计数系统,跟踪每个展览的参观次数和博物馆的整体统计数据。

你会将代码分成两个文件:

  • exhibit.dart:定义一个表示博物馆展览的 Exhibit 类。每个展览应包含:
    • 一个实例变量 name(String),用于保存展览名称
    • 一个初始值为 0 的实例变量 visitorCount(int),用于跟踪参观这个展览的人数
    • 一个初始值为 0 的静态变量 totalVisitors(int),用于跟踪所有展览的总参观次数
    • 一个接收展览名称的构造函数
    • 一个 recordVisit() 方法,同时递增展览的 visitorCount 和类的 totalVisitors
    • 一个用于打印展览信息的 displayStats() 方法
  • main.dart:导入展览类,并创建两个展览:
    • 一个 'Dinosaur Bones' 展览
    • 一个 'Ancient Egypt' 展览
    为 Dinosaur Bones 展览记录 3 次参观,然后为 Ancient Egypt 展览记录 2 次参观。记录完所有参观次数后,按创建顺序对每个展览调用 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]
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Dart 在线编译器