在上一篇中,我们已经学会了:
·使用 class 定义一个类
·使用构造函数创建对象
·使用对象访问属性和方法
例如:
User user = User('Tom', 18);你可能会有这些疑问:
·构造函数到底是什么?
·为什么函数名和类名一样?
·this.name 中的 this 到底指什么?
·一个类能不能有多个构造方式?
这一篇,我们就把这些问题一次性讲清楚。
一、什么是构造函数?
构造函数的作用只有一个:
在创建对象时,初始化对象的数据
当你写下这行代码:
User('Tom', 18);实际上发生了两件事:
1.创建一个 User 对象
2.给这个对象的属性赋初始值
这个过程,就是由 构造函数 完成的。
二、最基础的构造函数
class User {
String name;
int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
}理解重点:
·构造函数 名字必须和类名一样
·没有返回值
·在对象创建时自动执行
三、this 关键字到底是什么?
在上面的代码中:
this.name = name;这里出现了两个 name,它们并不一样:
·左边的 name → 对象自己的属性
·右边的 name → 构造函数的参数
📌 this 表示:
当前正在创建的这个对象
换句话说:
this.name等价于:
“这个对象的 name 属性”
四、为什么要使用 this?
如果不使用 this,代码会变得不清晰甚至错误。
name = name; // ❌ 无意义,自己给自己赋值所以当:
·属性名
·参数名
相同时,就必须使用 this 来区分。
五、构造函数的简写形式(推荐)
Dart 提供了一种非常常用、非常优雅的写法:
class User {
String name;
int age;
User(this.name, this.age);
}这行代码等价于:
User(String name, int age) {
this.name = name;
this.age = age;
}📌 在 Flutter 项目中,90% 的构造函数都长这样
六、命名构造函数(Named Constructor)
有时候,一个类需要多种创建方式。
例如:
·从默认数据创建
·从接口数据创建
·创建一个“空对象”
这时就需要 命名构造函数。
1️⃣ 命名构造函数的定义方式
class User {
String name;
int age;
User(this.name, this.age);
User.guest() {
name = 'Guest';
age = 0;
}
}2️⃣ 使用命名构造函数
User user1 = User('Tom', 18);
User user2 = User.guest();📌 特点:
·类名 + . + 构造函数名
·表达语义非常清晰
七、命名构造函数的常见用途
class User {
String name;
int age;
User(this.name, this.age);
User.fromMap(Map<String, dynamic> map) {
name = map['name'];
age = map['age'];
}
}使用:
Map<String, dynamic> data = {
'name': 'Lucy',
'age': 20,
};
User user = User.fromMap(data);📌 这是 后续 JSON / 接口数据解析的核心写法
八、构造函数在 Flutter 中的意义
在 Flutter 中:
·每一个 Widget 都有构造函数
·参数通过构造函数传入
·this.xxx 是最常见写法
例如(概念层面):
MyWidget({this.title});📌 你现在学的内容,会在 Flutter UI 中被大量使用。
九、一个综合示例
class Product {
String name;
int price;
Product(this.name, this.price);
Product.free() {
name = 'Free Product';
price = 0;
}
void showInfo() {
print('$name 的价格是 ¥$price');
}
}使用:
Product p1 = Product('iPhone', 5999);
Product p2 = Product.free();
p1.showInfo();
p2.showInfo();十、总结
本篇你已经学会了:
·构造函数的作用
·this 关键字的真正含义
·构造函数的简写方式
·命名构造函数的使用场景
你已经正式掌握了:
Dart 面向对象编程的核心细节
🔜 下一篇预告
《Flutter 零基础入门(十):final、const 与不可变数据》
下一篇我们将学习:
·final 和 const 的区别
·编译时常量 vs 运行时常量
·为什么 Flutter 强烈推荐使用 const
·写出更高性能、更安全的代码
这是一个:
从“能用”走向“写得好”的关键主题