Menu
CoddyTech

初始化列表

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

初始化列表是构造函数中冒号后、函数体前的代码。它会在构造函数体执行之前运行,用于初始化实例变量。

你已经在前面的课中见过初始化列表:

Point.origin() : x = 0, y = 0;

冒号后面的部分(x = 0, y = 0)是初始化列表。多个初始化项之间用逗号分隔。

使用 final 变量时,初始化列表至关重要,因为必须在构造函数体运行前设置这些变量:

class Circle {
  final double radius;
  final double area;

  Circle(double r)
      : radius = r,
        area = 3.14159 * r * r;
}

Circle c = Circle(5);
print(c.radius); // 5.0
print(c.area);   // 78.53975

初始化列表还可以在给构造函数参数赋值之前进行计算或转换。当你需要在创建对象时推导值或验证数据,这会很有用。

你可以将简写 this. 语法与初始化列表结合使用:

class Rectangle {
  final double width;
  final double height;
  final double area;

  Rectangle(this.width, this.height)
      : area = width * height;
}

Rectangle rect = Rectangle(4, 5);
print(rect.area); // 20.0

这里,width 和 height 通过简写赋值,而 area 则在初始化列表中使用这些值进行计算。

challenge icon

挑战

简单

我们来编写一个盒子尺寸计算器,使用初始化列表在创建对象时计算派生值。

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

  • box.dart:定义一个 Box 类,用来表示具有尺寸和自动计算属性的 3D 盒子。这个类应包含:
    • 三个 final double 字段:length、width 和 height
    • 两个计算得出的 final double 字段:volume 和 surfaceArea
    • 一个使用 this. 简写来接收 length、width 和 height 的构造函数,并使用初始化列表计算 volume(length × width × height)和 surfaceArea(2 × (length×width + width×height + height×length))
    • 一个用于打印盒子信息的 display() 方法
  • main.dart:导入你的盒子类,并创建两个盒子:
    • 尺寸为 3.0、4.0、5.0 的盒子
    • 尺寸为 2.0、2.0、2.0 的盒子
    按照上面列出的顺序,对每个盒子调用 display()。

display() 方法应严格按照以下格式打印:

Box: [length]x[width]x[height] | Volume: [volume] | Surface: [surfaceArea]

预期输出:

Box: 3.0x4.0x5.0 | Volume: 60.0 | Surface: 94.0
Box: 2.0x2.0x2.0 | Volume: 8.0 | Surface: 24.0

亲手试试

import 'box.dart';

void main() {
  // TODO: 创建一个尺寸为 3.0、4.0、5.0 的盒子
  
  // TODO: 创建一个尺寸为 2.0、2.0、2.0 的盒子
  
  // TODO: 依次对每个盒子调用 display()
  
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Dart 在线编译器