静态方法与字段
本课属于 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; // 错误!不能访问实例字段
}
}当功能不依赖对象状态时,可以使用静态成员。实用函数、工厂跟踪或共享常量都是理想的选择。
挑战
简单我们来构建一个用于字符串操作的工具类,展示静态方法和字段如何协同工作,在无需创建对象的情况下提供实用功能。
你将创建两个文件来组织代码:
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() 打印统计信息
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器