Dart构造函数:实例化与继承详解
在Dart中,构造函数 是不会被子类继承的,所有当定义一个继承类时,继承类还是要重新定义构造函数。super 用于指向父类中的构造函数参数 ,意思是通过子类中构造函数传递参数给父类中构造函数。1,当子类继承父类,父类构造函数没有默认值时,子类定义构造函数时必须为父类元素传递默认值。2,当子类继承父类,父类构造函数有默认值时,子类可以不强制传递默认值给父类构造函数。3,当父类构造函数是无参构造函数,
引言
构造函数作用
1. 在Dart 类中,与类同名的函数叫做构造函数。目的是类的实例化时,给实例化的元素传递默认值。(避免实例化的元素属性为空,引发异常)
2. 每个类中都必须有构造函数,这是Dart语法规则;用户不写,Dart也会自动添加无参构造函数
3. Flutter 需要构造函数原因
- Widget 初始化:设置 Widget 初始状态和行为
- 配置传递:接收外部传入的配置参数和数据
- 性能优化:通过 const 构造函数提高渲染性能
- 代码复用:通过不同的构造函数提供多种初始化方式
- 继承支持:配置 super 关键字实现类的继承关系
为什么父类定义了构造函数,子类继承父类后还需要定义构造函数?
在Dart中,构造函数 是不会被子类继承的,所有当定义一个继承类时,继承类还是要重新定义构造函数。
// 构造函数示例
class Student {
int id;
String name;
int age;
// 构造函数 标准写法(语法糖)
Student(this.id, this.name, this.age);
// 写法2 添加函数体内容
Student(this.id, this.name, this.age) {
print("构造函数运行!");
}
// 构造函数 分解写法(不惯用)
Student(int id, String name, int age)
{
this.id = id;
this.name = name;
this.age = age;
}
}
// 类继承 + 子类传递元素默认值给父类写法
// 父类
class Student {
int id;
String name;
int age;
Student(this.id, this.name, this.age);
}
// 子类继承父类
class Boy_Student extends Student {
int score;
// 子类构造函数
// 因父类构造为设置默认值,子类构造函数必须同步传递默认值给父类元素
Boy_Student (this.score, int id, String name, int age) : super(id, name, age)
{
// 构造函数函数体
// add code ...
}
}
关于 this 与 super
this 用于指向当前类的实例,意思是传递实参给类元素
super 用于指向父类中的构造函数参数 ,意思是通过子类中构造函数传递参数给父类中构造函数
关于传递
1,当子类继承父类,父类构造函数没有默认值时,子类定义构造函数时必须为父类元素传递默认值。
// 通过传递给父类的构造函数,间接传递给父类元素
示例:Boy_Student (int id, String name, int age, this.score) : super(id, name, age)
2,当子类继承父类,父类构造函数有默认值时,子类可以不强制传递默认值给父类构造函数。
示例:父类构造函数有默认值情况
Student(this.id = 0, this.name = ”未知学生“, this.age = 18)
3,当父类构造函数是无参构造函数,子类构造函数可以不显性写 super()
Flutter Demo 代码理解
// 从Dart语法规则 解释 Flutter Demo 含义
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp()); // 将类的实例化传递给函数
}
class MyApp extends StatelessWidget { // 定义一个类,继承自StatelessWidget类
const MyApp({ // 子类定义自己的构造函数
super.key, // 子类未定义新属性或方法,但根据Dart语法规则,需要为 父类构造函数 key参数 传递值(类内定义,实例化时传递)
});
// 重写父类build方法,定义UI构建逻辑
@override // 重写标识
Widget build(BuildContext context) // 在子类MyApp中重写父类StatelessWidget buld方法
{
return MaterialApp( // 重写内容为 实例化MaterialApp类,实例化时设置MaterialApp类中各种属性或方法的值
title: 'Flutter Demo',
theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple)),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
更多推荐



所有评论(0)