You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中两种构造器初始化final变量为何仅一种可正常运行?

Dart构造器初始化final变量规则说明

两种构造器的核心区别

  • 第一种Test(this.a, this.b)属于Dart的初始化形参语法,本质是构造器初始化列表的简写,赋值操作发生在类实例完全创建完成之前。
  • 第二种是将赋值逻辑放在构造函数的函数体内部,执行顺序晚于实例初始化阶段。

报错原因与相关规则

Dart中final修饰的实例变量要求必须在实例创建完成前完成唯一一次赋值,赋值后不可修改,合法的赋值时机只有两个:

  1. 声明变量时直接赋值;
  2. 在构造器的初始化列表阶段完成赋值,包括使用this.参数的初始化形参写法、手动编写初始化列表:
// 手动写初始化列表和第一种写法效果完全等价,也可以正常给final变量赋值
Test(int a, int b): a = a, b = b;

构造函数体的执行时机,是在初始化列表执行完毕、实例的基础结构已经构建完成之后,此时final变量已经被标记为初始化完成不可修改,在函数体中执行this.a = a本质是修改不可变的final变量,因此触发编译错误。
而第三种示例中移除了final修饰符,变量本身支持修改,因此在构造函数体内赋值不受限制,可以正常运行。

内容的提问来源于stack exchange,提问作者Ayrix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:54:04