当前位置: 首页 > news >正文

Flutter---构造函数

基本构造函数

class Person { String name; int age; // 普通构造函数 Person(String name, int age) { this.name = name; this.age = age; } // 简化写法:直接把参数赋值给成员变量 // Person(this.name, this.age); // ← 一行搞定! } void main() { Person p = Person("张三", 25); print("${p.name}, ${p.age}"); // 张三, 25 }

命名构造函数

命名构造函数就是有名字的构造函数,可以有多个,用.区分

class Person { String name; int age; // 默认构造函数 Person(this.name, this.age); // 命名构造函数1:从地图创建 Person.fromMap(Map<String, dynamic> map) : name = map['name'], age = map['age']; // 命名构造函数2:从 JSON 创建 Person.fromJson(String jsonString) : name = "解析出的名字", age = 0; // 命名构造函数3:创建默认人员 Person.guest() : name = "游客", age = 0; } void main() { // 使用不同的构造函数创建对象 Person p1 = Person("张三", 25); // 普通 Person p2 = Person.fromMap({'name': '李四', 'age': 30}); // 命名 Person p3 = Person.guest(); // 命名 print(p1.name); // 张三 print(p2.name); // 李四 print(p3.name); // 游客 }

初始化列表

初始化列表是:后面的部分,在构造函数体执行前运行

class Person { final String name; // final 变量必须初始化 final int age; // 初始化列表:在构造函数体之前初始化 final 变量 Person.fromMap(Map<String, dynamic> map) : name = map['name'], // ← 初始化列表 age = map['age'] { // ← 这里不能写赋值了 // 构造函数体 print("对象创建完成"); } }

初始化列表的优势

class Example { final int a; int b; // ❌ 错误:final 变量不能在构造函数体中赋值 Example(int value) { a = value; // 编译错误! b = value; // 普通变量可以 } // ✅ 正确:final 变量必须在初始化列表赋值 Example(int value) : a = value { // ← 这里赋值 b = value; } }

使用super,调用父类构造函数

// 父类 class Animal { String type; Animal(this.type) { print("Animal 构造函数"); } Animal.named(this.type) { print("Animal 命名构造函数"); } } // 子类 class Dog extends Animal { String name; // 调用父类普通构造函数 Dog(String name, String type) : super(type) { this.name = name; print("Dog 构造函数"); } // 调用父类命名构造函数 Dog.fromMap(Map<String, dynamic> map) : name = map['name'], //初始化自己的属性 super.named(map['type']) { //初始化父类的属性 print("Dog 命名构造函数"); } } void main() { Dog d1 = Dog("旺财", "犬科"); // 输出: // Animal 构造函数 // Dog 构造函数 Dog d2 = Dog.fromMap({'name': '小黑', 'type': '犬科'}); // 输出: // Animal 命名构造函数 // Dog 命名构造函数 }

疑问点

1.子类为什么要调用父类的构造函数? 答:子类必须调用父类构造函数,因为父类的属性需要被初始化! 2.谁负责初始化父类属性? 父类自己的构造函数 3.子类能直接给父类属性赋值吗? 不能,因为父类属性可能是final 4.怎么调用 在初始化列表中用super(...)

可视化理解

http://www.jsqmd.com/news/547099/

相关文章:

  • Souliss嵌入式智能家居框架:轻量级去中心化通信架构
  • G-Helper:重新定义华硕笔记本的硬件掌控权
  • Linux网络端口占用排查与解决方案
  • Ollama-for-amd:释放AMD GPU潜能的本地AI部署平台
  • PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用
  • OpenClaw技能扩展实战:用Qwen3-32B-Chat自动生成周报
  • PKE低频天线基础知识与原理
  • 从蓝牙耳机到智能家居:图解PCM接口的5大实战用法
  • Llama-3.2模型实战:如何解决tokenizer缺少padding token的报错(附两种方案对比)
  • ESP8266轻量级Flash-SRAM映射内存库FSmem
  • Alist与Cloudflare R2的无缝对接:WebDAV本地挂载实战与优化技巧
  • ESP32模拟ZDI协议调试eZ80嵌入式系统
  • 2026红外发射管优质厂家推荐榜聚焦交期与稳定性:红外线发射管/贴片式红外线接收器/光敏三极管/红外线接收器/选择指南 - 优质品牌商家
  • PHP后端十年:从0到资深开发者的10堂必修课【第6篇】
  • 2026汕头高口碑婚纱摄影工作室推荐榜:汕头街拍婚纱照/澄海婚纱照/金平婚纱摄影/龙湖婚纱照/汕头写真/汕头复古婚纱照/选择指南 - 优质品牌商家
  • OpenClaw备份方案:GLM-4.7-Flash模型与配置迁移指南
  • 利用快马平台ai能力快速生成vmware虚拟机开发环境原型
  • 低功耗电源开关电路设计与MCU控制实现
  • nRF52833 DK开发板开箱即用指南:从硬件连接到第一个蓝牙例程烧录(基于nRF5 SDK v17.x)
  • 告别AT指令!在STM32上移植MQTT客户端库(以Paho MQTT Embedded C为例)
  • 17 种 RAG 优化策略
  • PP-DocLayoutV3项目实战:重构“黑马点评”业务,实现菜单图片的自动解析与录入
  • NASA、ESA、Landsat API全打通,Python遥感数据采集链路闭环方案,仅剩最后2个认证漏洞未公开
  • LangGraph实战:从零构建并部署一个多功能智能体
  • 算法探索与原型验证:Python与PyTorch
  • 腾讯游戏卡顿终极解决方案:ACE-Guard资源限制器完整指南
  • cocosCreator + fairyGUI 实战指南:从零搭建高效UI系统
  • 实时盯盘系统卡顿、爆内存、延迟超2.3秒?:用asyncio+TA-Lib+Cython重构金融信号引擎(性能提升9.6倍)
  • 快速验证控制逻辑:用快马平台十分钟搭建pid算法仿真原型
  • python-flask-djangol框架的青少年法律宪法学习宣传平台