Flutter学习6 - Dart 类与对象

1、面向对象编程(Object-Oriented Programming, OOP)三大特征

(1)封装

  • 封装是指将对象的状态(属性)和行为(方法)封装在一起,对外部隐藏对象的内部细节,只提供公共的访问方式。
  • 通过封装,可以保护对象的状态不被外部直接访问和修改,只能通过对象提供的接口进行操作,提高了安全性和可维护性。

(2)继承

  • 继承是指一个类(子类)可以从另一个类(父类)中继承属性和方法的机制。
  • 子类可以继承父类的公共成员,并且可以通过重写(Override)或扩展(Extend)父类的方法来实现特定的行为。
  • 继承可以减少代码的重复性,提高代码的可重用性和可扩展性。

(3)多态

  • 多态是指同一个方法调用可以根据对象的不同类型而具有不同的行为。
  • 多态可以通过继承和接口实现,其中包括重载(Overloading)和重写(Overriding)两种形式。
  • 多态可以提高代码的灵活性和扩展性,使得程序能够更好地应对不同的需求和情况。

重载(Overloading)

// 相同方法名,不同参数
fun foo() {}
fun foo(str: String?) {}

重写(Overriding)

// 子类重新定义(覆盖)了父类中已有的方法
open class Animal{open fun makeSound(){System.out.println("Animal makes a sound");}
}class Cat : Animal(){override fun makeSound() {System.out.println("Cat makes a sound");}
}

2、Dart 中的类与对象

(1)类与对象

void main() {Person person = Person("leon", 18);print(person.toString()); //name: leon  age: 18
}//所有的类均继承自 Object
class Person {String? name;int? age;Person(this.name, this.age);//重写父类的方法String toString() {return "name: $name  age: $age";}
}

(2)初始化列表

void main() {Student student1 = Student("艾伦", 19, '清华大学');print(student1.toString()); //name: 艾伦  age: 19  school: 清华大学  city: null  country: 中国Student student2 = Student("三笠", 20, '复旦大学', city: '上海');print(student2.toString()); //name: 三笠  age: 20  school: 复旦大学  city: 上海  country: 中国Student student3 = Student("莱纳", 21, '哈佛大学', city: '剑桥', country: '美国');print(student3.toString()); //name: 莱纳  age: 21  school: 哈佛大学  city: 剑桥  country: 美国
}class Student extends Person {//通过查下划线标识私有字段,作用域是当前文件String? _school;String? city;String? country;String? funName;/*** 初始化列表  funName = '$country.$city'* 必填项  name. age, _school* 选填项 city, country* 带默认值 country*/Student(name, age, this._school, {this.city, this.country = "中国"}): funName = '$country.$city', super(name, age) {//构造函数体不是必须的}String toString() {return "name: $name  age: $age  school: $_school  city: $city  country: $country";}
}

(3)命名构造方法

  • 命名构造方法,在类的里面,通过 “类名.方法名” 的方式构造
  • 使用命名构造方法可以实现多个构造方法
void main() {Student s1 = Student.create1("炭治郎");print(s1.toString()); //name: 炭治郎  age: 0  school: null  city: null  country: nullStudent s2 = Student.create2('祢豆子', 4);print(s2.toString()); //name: 祢豆子  age: 4  school: null  city: null  country: nullStudent s3 = Student.create3('利威尔', 24, '巨人学院');print(s3.toString()); //name: 利威尔  age: 24  school: 巨人学院  city: null  country: null
}class Student extends Person {//通过查下划线标识私有字段,作用域是当前文件String? _school;String? city;String? country;String? funName;Student(name, age) : super(name, age) {//构造函数体不是必须的}/*** 命名构造方法:类名.方法名*/Student.create1(name) : super(name, 0) {}Student.create2(name, age) : super(name, age) {}Student.create3(name, age, school) : super(name, age) {_school = school;}String toString() {return "name: $name  age: $age  school: $_school  city: $city  country: $country";}
}

注:当有 final 变量时,命名构造方法必须初始化它
注:构造函数中也必须初始化 final 变量

void main() {Student s1 = Student.create1("炭治郎", '鬼灭学院');print(s1.toString()); //name: 炭治郎  age: 0  school: 鬼灭学院  city: null  country: nullStudent s2 = Student.create2('祢豆子', 4, '鬼灭学院');print(s2.toString()); //name: 祢豆子  age: 4  school: 鬼灭学院  city: null  country: nullStudent s3 = Student.create3('利威尔', 24, '巨人学院', '玛利亚', '日本');print(s3.toString()); //name: 利威尔  age: 24  school: 巨人学院  city: 玛利亚  country: 日本
}class Student extends Person {//通过查下划线标识私有字段,作用域是当前文件final String? _school;String? city;String? country;String? funName;//构造函数中也必须初始化 final 变量Student(name, age, this._school) : super(name, age) {//构造函数体不是必须的}/*** 命名构造方法中必须 初始化 final 变量*/Student.create1(name, this._school) : super(name, 0) {}Student.create2(name, age, this._school) : super(name, age) {}Student.create3(name, age, this._school, this.city, country) : super(name, age) {this.country = country;}String toString() {return "name: $name  age: $age  school: $_school  city: $city  country: $country";}
}

(4)命名工厂构造方法

  • 命名工厂构造方法,在类的里面,通过 " factory 类名.方法名" 方式构造
  • 会返回一个实例对象
void main() {Student s1 = Student.generate1('冯宝宝', 200);print(s1.toString()); //name: 冯宝宝  age: 200  school: null  city: null  country: nullStudent s2 = Student.generate2('张楚岚', 18, '野鸡大学');print(s2.toString()); //name: 张楚岚  age: 18  school: 野鸡大学  city: null  country: null
}class Student extends Person {//通过查下划线标识私有字段,作用域是当前文件String? _school;String? city;String? country;String? funName;Student(name, age) : super(name, age) {//构造函数体不是必须的}/*** 命名工厂构造方法:factory  类名.方法名* 它会返回一个实例对象*/factory Student.generate1(name, age) {return Student(name, age);}factory Student.generate2(name, age, school) {Student s = Student(name, age);s._school = school;return s;}String toString() {return "name: $name  age: $age  school: $_school  city: $city  country: $country";}
}

注:命名工厂构造方法无需初始化 final 变量

void main() {Student s1 = Student.generate1('冯宝宝', 200);print(s1.toString()); //name: 冯宝宝  age: 200  school: 未知  city: null  country: nullStudent s2 = Student.generate2('张楚岚', 18, '野鸡大学');print(s2.toString()); //name: 张楚岚  age: 18  school: 野鸡大学  city: null  country: null
}class Student extends Person {//通过查下划线标识私有字段,作用域是当前文件final String? _school;String? city;String? country;String? funName;//构造函数中也必须初始化 final 变量Student(name, age, this._school) : super(name, age) {//构造函数体不是必须的}/*** 命名工厂构造方法:factory  类名.方法名* 它会返回一个实例对象*/factory Student.generate1(name, age) {return Student(name, age, '未知');}factory Student.generate2(name, age, school) {return Student(name, age, school);}String toString() {return "name: $name  age: $age  school: $_school  city: $city  country: $country";}
}

(5)工厂构造方法

  • 通常是通过它实现单例
void main() {LogUtils log1 = LogUtils();LogUtils log2 = LogUtils();//若是单例,则 log1 == log2print("log1 与 log2 是否为同一个单例: ${log1 == log2}"); //log1 与 log2 是否为同一个单例: true//调用单例内的方法log1.log("输出日志 test"); //输出日志 test
}/*** 工厂构造方法  实现单例*/
class LogUtils {//静态私有成员static LogUtils? _instance;//命名构造方法,私有方法LogUtils._getInstance();//工厂构造方法factory LogUtils() {// ??=:表示若 _instance 为空,则取等号后面的值//若 _instance 不空,则继续执行下面代码,返回 _instance_instance ??= LogUtils._getInstance();return _instance!;}log(String msg) => print(msg);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#LLM入门|Prompt#1.1 第一部分_面向开发者的LLM入门教程_简介

Prompt工程:解锁大语言模型潜能的关键技巧 随着大语言模型(LLM)的兴起,Prompt工程已成为开发者利用LLM构建功能强大应用的关键技能。在这个新时代,Prompt不仅是指导LLM的输入形式,更是塑造其能力上限与下限…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…

OpenCV 4基础篇| OpenCV图像基本操作

目录 1. 图像读取1.1 cv2.imread() 不能读取中文路径和中文名称1.2 cv2.imdecode() 可以读取中文路径和中文名称 2. 图像的显示2.1 openCV显示图像 cv2.imshow()2.2 matplotlib显示图像 plt.imshow() 3. 图像的保存 cv2.imwrite()4. 图像的复制4.1 img.copy()4.2 np.copy()4.3 …

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

RabbitMQ 网络分区处置策略配置

概述 集群成员之间的网络连接故障会影响客户端操作的数据一致性和可用性&#xff08;如CAP定理&#xff09;。 由于不同的应用程序对一致性有不同的要求 并且可以容忍不同程度的不可用&#xff0c;可以使用不同的分区处理策略。 检测网络分区 节点确定其对等节点是否关闭&am…

个性化纹身设计,Midjourney带你探索独一无二的艺术之美

hello,大家好&#xff0c;欢迎回来。 在当今社会&#xff0c;纹身已经变得非常常见。 在寻求与众不同的个性化纹身时&#xff0c;你是否曾经为了找不到独特的设计而苦恼&#xff1f; 现在&#xff0c;Midjourney将为你打开一扇全新的艺术之门&#xff0c;引领你探索纹身设计…

高通 Android 12 Settings不显示版本号问题

1、最近项目遇到一个奇葩问题&#xff0c;编译系统版本号不见了&#xff1f; 2、一开始我想着可能是自己代码没有make clean结果编译几个小时&#xff0c;然后烧录固件发现还是未生效。 3、然后这时候我又去看git log review最近修改也没有太大发现&#xff08;待定&#xff…

docker安装flink

docker安装flink 5.1、拉取flink镜像&#xff0c;创建网络 docker pull flink docker network create flink-network5.2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES&…

第一篇:大纲

目录 第一篇&#xff1a;大纲 第二篇&#xff1a;CamX初认识(框架、代码结构介绍) 第三篇&#xff1a;CamX日志打印系统 第四篇&#xff1a;CamX确认当前选择的usecase、pipeline、sensormode 第五篇&#xff1a;CamX添加自定义node 第六篇&#xff1a;CamX添加自定义ven…

ArcgisForJS如何在线编辑ArcGIS Server发布的几何要素?

文章目录 0.引言1.ArcGIS创建几何要素2.ArcGIS Server发布几何要素3.ArcgisForJS在线编辑ArcGIS Server发布的几何要素 0.引言 ArcGIS For JS 是一种用于创建和编辑地理信息的 JavaScript 库&#xff0c;它允许用户在线编辑 ArcGIS Server 发布的几何要素。本文从ArcGIS创建几…

07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存

1. 高级映射 例如有两张表, 分别为班级表和学生表 自然, 一个班级对应多个学生 像这种数据 , 应该如果如何映射到Java的实体类上呢? 这就是高级映射解决的问题 以班级和学生为例子 , 因为一个班级对应多个学生 , 因此学生表中必定有一个班级编号字段cid 但我们在学生的实体…

Yolov9全文翻译!

Yolo v9全文翻译 论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main 大量图片来袭&#xff01;

为什么说抖店适合电商新手入局?门槛及运营玩法,今天一文详解!

大家好&#xff0c;我是电商小布。 现在&#xff0c;越来越多的人开始加入到了电商这个行业&#xff0c;原因就是看到了它发展的可能性。 而抖音小店这个项目&#xff0c;作为近几年发展势头非常猛的电商项目&#xff0c;成为了很多小伙伴们的首选。 为什么会这样呢&#xf…

QT/自定义槽和信号

创建两个类student和teacher&#xff0c;父类都为QObject 在teacher中自定义Signal&#xff0c;hungry //自定义信号&#xff0c;写道signals下 signals://返回值void//只需要声明//可以有参数&#xff0c;可以重载void hungry();void hungry(QString FoodName); 在student中…

抖音数据抓取工具|视频内容提取软件

引言部分&#xff1a; 介绍针对抖音视频下载需求开发的强大工具突出解决用户获取抖音视频繁琐问题的初衷 工具功能介绍&#xff1a; 详细描述工具功能&#xff0c;包括关键词搜索、自动批量抓取、选择性批量下载等提及基于C#开发的优势以及支持通过分享链接进行单个视频抓取…

10:部署Dashboard|部署Prometheus|HPA集群

部署Dashboard&#xff5c;部署Prometheus&#xff5c;HPA集群 Dashboard部署Dashboard上传镜像到私有仓库安装服务发布服务创建管理用户查看登录的Token信息 Prometheus步骤一&#xff1a;导入所有后续需要的镜像到私有镜像仓库&#xff08;在master主机操作操作&#xff09;步…

【区块链】智能交易模式下的数据安全流通模型

【区块链】智能交易模式下的数据安全流通模型 写在最前面**区块链智能交易模式概述****数据安全流通的挑战****数据安全流通模型的核心要素****实现数据安全流通的区块链技术****区块链智能交易模式下数据安全流通模型的设计原则****数据安全流通模型的应用案例分析****面临的挑…

ONLYOFFICE8.0——赋能办公

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

c语言常用输入输出函数

目录 *概述*1. printf函数&#xff1a;用于向屏幕输出格式化的数据。2. scanf函数&#xff1a;用于从键盘读取输入并赋值给变量。3. getchar函数&#xff1a;用于从键盘读取单个字符。4. putchar函数&#xff1a;用于向屏幕输出单个字符。5. gets函数&#xff1a;用于从键盘读取…

IDEA 重装我都会默默的下载这些好用的插件

本文已经收录公众号&#xff1a;面汤放盐 IDEA 重装我都会默默的下载这些好用的插件 (qq.com) 这几年用得最多的插件&#xff0c;分享给大家。工欲善其事&#xff0c;必先利其器&#xff01;每一次电脑重装&#xff0c;更换工作&#xff0c;我都会默默地打开我的插件收藏单&a…