Menu
CoddyTech

静态方法与字段

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 20 课,共 110 课。

现在你已经了解实例成员和静态成员之间的区别,让我们来看看如何有效使用静态方法和字段。静态成员非常适合实现属于类本身,而不是属于单个对象的功能。

静态字段用于存储所有实例共享的数据。常见用途包括计数器、配置值或缓存数据:

class MathHelper {
  static const double pi = 3.14159;
  static int calculationCount = 0;
  
  static double circleArea(double radius) {
    calculationCount++;
    return pi * radius * radius;
  }
}

print(MathHelper.circleArea(5));  // 78.53975
print(MathHelper.circleArea(3));  // 28.27431
print(MathHelper.calculationCount);  // 2

请注意,你直接通过类名调用静态方法,而不是通过实例调用。MathHelper 类的作用类似于工具类,你不需要创建 MathHelper 对象。

一条重要规则:静态方法不能直接访问实例成员。它们无法访问 this,因为它们不属于任何特定对象:

class Counter {
  int value = 0;  // 实例字段
  static int total = 0;  // 静态字段
  
  void increment() {
    value++;  // 没问题:实例方法可以访问实例字段
    total++;  // 没问题:实例方法可以访问静态字段
  }
  
  static void reset() {
    total = 0;  // 没问题:静态方法可以访问静态字段
    // value = 0;  // 错误!不能访问实例字段
  }
}

当功能不依赖对象状态时,可以使用静态成员。实用函数、工厂跟踪或共享常量都是理想的选择。

challenge icon

挑战

简单

我们来构建一个用于字符串操作的工具类,展示静态方法和字段如何协同工作,在无需创建对象的情况下提供实用功能。

你将创建两个文件来组织代码:

  • string_utils.dart:定义一个用作工具辅助类的 StringUtils 类。你的类应包含:
    • 一个设为 '-' 的 static const String defaultSeparator
    • 一个从 0 开始的 static int operationCount,用于跟踪已执行的操作数
    • 一个静态方法 reverse(String text),用于递增 operationCount 并返回反转后的字符串
    • 一个静态方法 join(String first, String second),用于递增 operationCount 并返回用 defaultSeparator 连接的两个字符串
    • 一个静态方法 countVowels(String text),用于递增 operationCount 并返回元音字母的数量(a、e、i、o、u,不区分大小写)
    • 一个静态方法 getStats(),用于返回显示已执行操作总数的字符串
  • main.dart:导入你的工具类并使用它的静态方法:
    • 用 'hello' 调用 reverse(),并打印结果
    • 用 'dart' 和 'lang' 调用 join(),并打印结果
    • 用 'Programming' 调用 countVowels(),并打印 Vowels: [count]
    • 使用 getStats() 打印统计信息

记住,所有方法都是静态方法,因此要直接通过类名调用它们,你不会创建任何 StringUtils 对象。

getStats() 方法应按以下格式返回:

Operations performed: [operationCount]

预期输出:

olleh
dart-lang
Vowels: 3
Operations performed: 3

亲手试试

import 'string_utils.dart';

void main() {
  // TODO: 用 'hello' 调用 reverse(),并打印结果
  
  // TODO: 用 'dart' 和 'lang' 调用 join(),并打印结果
  
  // TODO: 用 'Programming' 调用 countVowels(),并打印 "Vowels: [count]"
  
  // TODO: 使用 getStats() 打印统计信息
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Dart 在线编译器