Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

Flutter&Dart零基础入门教程(一)
Flutter 零基础入门(二):Dart 字符串与字符串插值
Flutter 零基础入门(三):条件判断与逻辑运算
Flutter零基础入门(四):switch、多分支判断与循环
Flutter零基础入门(五):List列表与遍历
Flutter 零基础入门(六):Map 键值对与简单数据模型
Flutter 零基础入门(七):函数(Function)与代码封装
Flutter 零基础入门(八):Dart 类(Class)与对象(Object)

Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

公众号版

在上一篇中,我们已经学会了:

  • 使用 class 定义一个类
  • 使用构造函数创建对象
  • 使用对象访问属性和方法

例如:

dart 复制代码
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();

📌 特点:

  • 类名 + . + 构造函数名
  • 表达语义非常清晰

七、命名构造函数的常见用途

示例:从 Map 创建对象(非常重要)

复制代码
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 与不可变数据》

下一篇我们将学习:

  • finalconst 的区别
  • 编译时常量 vs 运行时常量
  • 为什么 Flutter 强烈推荐使用 const
  • 写出更高性能、更安全的代码

这是一个:

从"能用"走向"写得好"的关键主题

相关推荐
yyy(十一月限定版)7 小时前
初始matlab
开发语言·matlab
listhi5207 小时前
基于MATLAB的支持向量机(SVM)医学图像分割方法
开发语言·matlab
hui函数7 小时前
如何解决 pip install 编译报错 g++: command not found(缺少 C++ 编译器)问题
开发语言·c++·pip
Tisfy8 小时前
网站访问耗时优化 - 从数十秒到几百毫秒的“零成本”优化过程
服务器·开发语言·性能优化·php·网站·建站
济6178 小时前
嵌入式C语言(第一期)
c语言·开发语言
XiaoHu02078 小时前
Linux多线程(详细全解)
linux·运维·服务器·开发语言·c++·git
苏宸啊8 小时前
C++(二)类和对象上篇
开发语言·c++
一豆羹8 小时前
macOS 环境下 ADB 无线调试连接失败、Protocol Fault 及端口占用的深度排查
flutter
行者968 小时前
OpenHarmony上Flutter粒子效果组件的深度适配与实践
flutter·交互·harmonyos·鸿蒙