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

Dart中静态方法无法重写,但代码运行无报错?求原因

Dart中静态方法同名不报错的原因:不是重写,是隐藏

你看到的子类定义同名静态方法的行为,不是重写(override),而是静态方法的隐藏(hide),这是Dart允许的行为,所以不会触发报错。

核心区别:

  • 重写是针对实例方法的运行时多态特性:子类重写父类实例方法后,调用时会根据对象的实际类型(而非声明类型)执行对应的方法,可用@override注解标记(推荐)。
  • 静态方法属于类本身,绑定是编译期确定的:调用DartStudent.getDetails()时,编译器直接查找DartStudent类中定义的静态方法,和父类Student的同名静态方法没有继承上的重写关系,只是各自独立的方法。

验证:尝试用@override注解标记静态方法

如果给子类的静态方法加上@override注解,Dart编译器会直接报错,证明这不属于重写:

class Student {
  static void getDetails() {
    print('Get details method of Student class');
  }
}

class DartStudent extends Student {
  @override // 编译器报错:The annotation 'override' is not applicable to this declaration
  static void getDetails() {
    print('Get details method of DartStudent class');
  }
}

对比实例方法的重写

如果是实例方法,重写会体现运行时多态:

class Student {
  void getDetails() {
    print('Get details method of Student class');
  }
}

class DartStudent extends Student {
  @override
  void getDetails() {
    print('Get details method of DartStudent class');
  }
}

void main() {
  Student s = DartStudent();
  s.getDetails(); // 输出:Get details method of DartStudent class
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:06:25