Flutter类
Dart中的对象都继承自 Object 类,单继承(extend关键字)。Dart与Java、kotlin不同的是其无public、private、protected修饰符,默认public ,通过在属性名、方法名前加 _下划线 来定义是否私有。
实现一个简单的类
class Student {//默认publicfinal String name;//默认publicfinal int age;Student(this.name, this.age);@overridebool operator ==(Object other) {return identical(this, other) ||other is Student &&runtimeType == other.runtimeType &&name == other.name &&age == other.age;}@overrideint get hashCode => name.hashCode ^ age.hashCode;
}
import 'package:gsy_flutter_demo/model/Student.dart';main() {var stu = Student("Jack", 18);stu.name;stu.age;
}
在属性名、方法名前加 _下划线 来定义私有属性。
class Person {String _name = "jack";int _age = 18;
}


定义私有属性和方法的类需要抽离放到一个单独的文件或者模块中。否则不会生效,例如写在同一个文件中,仍然可以访问私有属性。
class Person {String _name = "jack";int _age = 18;
}main() {var person = Person();person._name;person._age;
}
类定义&使用
与Java、Kotlin一样,使用 class 关键字定义一个类。实例化可以使用new关键字创建,也可以省略。
class Student {final String name;final int age;Student(this.name, this.age);@overridebool operator ==(Object other) {return identical(this, other) ||other is Student &&runtimeType == other.runtimeType &&name == other.name &&age == other.age;}@overrideint get hashCode => name.hashCode ^ age.hashCode;
}var stu = Student("Jack", 18);var stu2 = Student("Mike", 20);
构造函数
构造函数有四种形式:类名构造函数、命名构造函数、常量构造函数、工厂构造函数。
定义一个类,默认会有一个 无参构造函数,如果有父类,还会调用父类的无参构造函数。
类名构造函数
Student(this.name, this.age);
命名构造函数(类名.修饰符 定义的函数)
Student.create(String name) : this(name, 20);
注意:命名构造函数不可继承。
常量构造函数
如果类创建的对象不会改变,就可以在编译期就创建这个常量实例,并定义一个常量构造函数,并且确保所有成员变量都是final的。
//常量构造函数
const Student(this.name, this.age);
工厂构造函数
工厂构造函数,构造函数私有,使用 factory 关键字进行定义,根据不同情况创建不同的对象。
class Fruit {final double price;final int weight;final String name;Fruit._(this.price, this.weight, this.name);//宸ュ巶鏋勯€犲嚱鏁版病鏈夎闂潈闄?factory Fruit(String name) {if (name == 'apple') {return Fruit._(12, 5, name);} else if (name == 'pear') {return Fruit._(15, 5, name);}return Fruit._(100, 100, name);}
get/set修饰符
class Fruit {final double price;final int weight;final String name;Fruit._(this.price, this.weight, this.name);//宸ュ巶鏋勯€犲嚱鏁版病鏈夎闂潈闄?factory Fruit(String name) {if (name == 'apple') {return Fruit._(12, 5, name);} else if (name == 'pear') {return Fruit._(15, 5, name);}return Fruit._(100, 100, name);}int? get fruitWeight => weight;set price(double price) {this.price = price;}
对象操作符
类型强转 as
Fruit apple = Fruit("apple");
int weight = (apple as Fruit).fruitWeight ?? 0;
类型判断 is
if (apple is Fruit) {print("apple");}
级联操作 ..
apple..price = 100.0..weight = 100..name = "Fruit";
class Fruit {final double price;late final int weight;late final String name;Fruit._(this.price, this.weight, this.name);factory Fruit(String name) {if (name == 'apple') {return Fruit._(12, 5, name);} else if (name == 'pear') {return Fruit._(15, 5, name);}return Fruit._(100, 100, name);}int? get fruitWeight => weight;set price(double price) {this.price = price;}
}main() {Fruit apple = Fruit("apple");int weight = (apple as Fruit).fruitWeight ?? 0;if (apple is Fruit) {print("apple");}apple..price = 100.0..weight = 100..name = "Fruit";
继承
子类使用 extends 关键字继承父类,子类会继承父类的属性和方法 (构造方法除外),使用 super 关键字调用父类属性/方法,或者给父类构造方法传参。
class Animal {late String name;late int type;Animal(this.name, this.type);
}class Tiger extends Animal {int weight;Tiger(super.name, super.type, this.weight);
}
接口和抽象类
接口的作用:解决多继承的二义性问题。即指的是多继承中方法和属性名称的冲突,编译器无法确定使用哪个父类的方法和属性。在Dart中,无interface关键字,所有类都被隐式定义成一个接口,任何类都可以作为接口被实现。Dart解决多继承、实现的二义性问题:子类必须将父类中所有属性和方法全部重写。
接口简单Demo
class DemoA {int num;DemoA(this.num);void printDemo() => print("DemoA");
}class DemoB {int num;DemoB(this.num);void printDemo() => print("DemoB");
}class DemoC implements DemoA, DemoB {@overrideint num = 6;@overridevoid printDemo() {print("DemoC");}}
注意:Java中的限制:接口中只能定义抽象成员和方法,且强制子类必须实现。
抽象类简单Demo
Dart中的抽象类不能被实例化,但可以包含 抽象方法 和 非抽象方法。
abstract class DemoA {String demoName;DemoA(this.demoName);void doA();void showA();void printA() {print("DemoA");}
}abstract class DemoB {String demoBName = "DemoB";void doDemoB();void showDemoB();void printDemoB() {print("DemoB");}
}class RealDemo implements DemoA, DemoB {@overrideString demoBName = "RealDemo";@overrideString demoName = "RealDemo";@overridevoid doA() {}@overridevoid doDemoB() {}@overridevoid printA() {}@overridevoid printDemoB() {}@overridevoid showA() {}@overridevoid showDemoB() {}
}
class RealDemo extends DemoA implements DemoB {@overrideString demoBName = "demoBName";RealDemo(super.demoName);@overridevoid doA() {}@overridevoid doDemoB() {}@overridevoid printDemoB() {}@overridevoid showA() {}@overridevoid showDemoB() {}
}
Mixins
Dart中使用with关键字,将一个类的功能添加到另一个类中 (该类可以复用其中的方法和属性),从而能实现多继承。mixin 关键字来定义一个混入类。
mixin Run {void run() => print("run");
}class Animal {}mixin Swim on Animal {void swim() => print("swim");
}class Tiger with Run {}class Fish extends Animal with Swim, Run {}main() {var fish = Fish();fish.swim();fish.run();var tiger = Tiger();tiger.run();
}
swim
run
run
注意: on子句 指定该mixin可以混入的类类型,只能混入到继承了Animal的类中。
枚举和密封类
Dart使用enum关键字定义枚举类型,枚举中的成员都有一个对应的索引值(这个值从0开始)。
枚举简单Demo
enum VALUE { VALUE_A, VALUE_B, VALUE_C }main() {for (var elemntValue in VALUE.values) {print(elemntValue);}
}
VALUE.VALUE_A
VALUE.VALUE_B
VALUE.VALUE_C
枚举支持 扩展方法
enum VALUE { VALUE_A, VALUE_B, VALUE_C }extension VALUE_OPERATE on VALUE {static VALUE getValueByIndex(int index) => VALUE.values[index];
}main() {var value = VALUE_OPERATE.getValueByIndex(1);print(value);
}
VALUE.VALUE_B
增强型枚举
enum Month {January(str: "January", num: 1),February(str: "February", num: 1),March(str: "March", num: 1),April(str: "April", num: 1),May(str: "May", num: 1),June(str: "June", num: 1),July(str: "July", num: 1),August(str: "August", num: 1),September(str: "September", num: 1),October(str: "October", num: 1),November(str: "November", num: 1),December(str: "December", num: 1);const Month({required this.str, required this.num});final String str;final int num;
}main() {print(Month.December.str);
}
December
密封类
与Kotlin类似,使用 sealed 关键字进行修饰,用于限制类的结构层次结构。
sealed class Status {}class StatusA extends Status {}class StatusB extends Status {}class StatusC extends Status {}String getStatusStr(Status status) {return switch (status) {StatusA() => "StatusA",StatusB() => "StatusB",StatusC() => "StatusC"};
}
相关文章:
Flutter类
Dart中的对象都继承自 Object 类,单继承(extend关键字)。Dart与Java、kotlin不同的是其无public、private、protected修饰符,默认public ,通过在属性名、方法名前加 _下划线 来定义是否私有。 实现一个简单的类 class…...
深入解析全连接层:PyTorch 中的 nn.Linear、nn.Parameter 及矩阵运算
文章目录 数学概念(全连接层,线性层)nn.Linear()nn.Parameter()Q1. 为什么 self.weight 的权重矩阵 shape 使用 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)而不是 ( in_featur…...
缓存对象反序列化失败
未定义serialVersionUID,会自动生成序列化号 新增了属性,序列号就变了,导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id! 那我如何找到未添加字段前 对象的序列化号呢?默认的序列化号是如何生成的呢&#…...
F28335的存储器与寄存器
1 存储器及CMD文件的编写 1 F28335的存储器 1.1 F28335存储器的结构 1.2 F28335存储器的映像 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射。 我们将《tms320f28335 数据手册》中“3.1…...
Python在AOIP(Audio Over IP)方面的应用探讨
Python在AOIP(Audio Over IP)方面的应用探讨 引言 随着网络技术的发展,音频传输逐渐向基于IP的解决方案迁移。音频通过互联网进行传输被称为音频过IP(Audio Over IP,简称AOIP)。这种技术在广播、现场活动…...
C++20标准对线程库的改进:更安全、更高效的并发编程
引言 C20 是 C 语言的一个重要里程碑,它引入了许多新特性,其中就包括对线程库(thread)的重大改进。这些改进不仅增强了语言的并发编程能力,还解决了先前版本中的一些痛点问题。本文将详细介绍 C20 在线程方面的改进&a…...
外包干了三年,快要废了。。。
先简单说一下自己的情况,普通本科,在外包干了3年多的功能测试,这几年因为大环境不好,我整个人心惊胆战的,怕自己卷铺盖走人了,我感觉自己不能够在这样蹉跎下去了,长时间呆在一个舒适的环境真的会…...
微服务网关终极进化:设计模式驱动的性能与可用性优化(四)
时间:2024年09月12日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 希望大家帮个忙!如果大家有工作机会,希望帮小蒋推荐一下,小蒋希望遇到一个认真做事的团队,一起努力…...
Java中的服务端点日志记录:AOP与SLF4J
Java中的服务端点日志记录:AOP与SLF4J 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在Java后端服务开发中,日志记录是监控和调试应用的关键手段。通过合理使用AOP&…...
黑马头条第八天实战(上)
D8 1)登录功能需求说明 用户根据用户名和密码登录密码需要手动加盐验证需要返回用户的token和用户信息 2)模块搭建思路步骤 2.1)模块作用 先捋一下之前搭模块干了啥 feign-api 远程调用 自媒体保存时调用远程客户端进行增加文章&#x…...
swift qwen2-vl推理及加载lora使用案例
参考: https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.html#%E5%BE%AE%E8%B0%83%E5%90%8E%E6%A8%A1%E5%9E%8B https://blog.csdn.net/weixin_42357472/article/details/142150209 SWIFT支持300+ LLM和50+ MLLM(多模态大模型…...
如何使用 Choreographer 进行帧率优化
Choreographer 是 Android 提供的一个工具类,专门用来协调 UI 帧的渲染。你可以通过 Choreographer 来精确控制帧的绘制时机,以优化帧率,确保应用的流畅度。以下是如何使用 Choreographer 进行帧率优化的详细步骤: 1. 理解 Chore…...
稳定驱动之选SiLM5350系列SiLM5350MDBCA-DG单通道隔离栅极驱动器(带内部钳位):工业自动化的可靠伙伴
SiLM5350系列SiLM5350MDBCA-DG是具体有10A峰值输出电流能力,单通道隔离式栅极驱动器。SiLM5350MDBCA-DG可提供内部钳位功能。驱动电源电压为4V至30V。3V至18V的宽输入VDDI范围使驱动器适合与模拟和数字控制器接口。所有电源电压引脚都有欠压锁定 (UVLO) 保护。 SiLM…...
鸿蒙OpenHarmony【轻量系统芯片移植】内核移植
移植芯片架构 芯片架构的移植是内核移植的基础,在OpenHarmony中芯片架构移植是可选过程,如果当前OpenHarmony已经支持对应芯片架构则不需要移植操作,在“liteos_m/arch”目录下可看到当前已经支持的架构,如表1: 表1 …...
多字节字符和宽字符
小时候,买东西的单位是一角、二角和五角,现在的单位是一元、五元和十元。人类社会的发展和计算机发展本质没啥两样,形态不同而已。 编码格式的历史 尽管早期只用ASCII码就可以表达所有字符,但计算机日益推广让其他国家不同语言的…...
C++缺省参数
个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则…...
深度学习中的常用线性代数知识汇总——第一篇:基础概念、秩、奇异值
文章目录 0. 前言1. 基础概念2. 矩阵的秩2.1 秩的定义2.2 秩的计算方法2.3 秩在深度学习中的应用 3. 矩阵的奇异值3.1 奇异值分解(SVD)3.2 奇异值的定义3.3 奇异值的性质3.4 奇异值的意义3.5 实例说明3.6 奇异值在深度学习中的应用 0. 前言 按照国际惯例…...
MATLAB | R2024b更新了哪些好玩的东西?
Hey, 又到了一年两度的MATLAB更新时刻,MATLAB R2024b正式版发布啦!,直接来看看有哪些我认为比较有意思的更新吧! 1 小提琴图 天塌了,我这两天才写了个半小提琴图咋画,MATLAB 官方就出了小提琴图绘制方法。 小提琴图…...
嵌入式硬件基础知识
嵌入式硬件基础知识涵盖了嵌入式系统中的硬件组成及其工作原理,涉及处理器、存储器、外设接口、电源管理等多个方面。这些硬件共同构成了一个完整的嵌入式系统,用于执行特定任务。下面我们来详细介绍嵌入式硬件的基础知识。 1. 嵌入式系统的组成 嵌入式…...
keepalived和lvs高可用集群
keepavlied和lvs高可用集群搭建 主备模式: 关闭防火墙和selinux systemctl stop firewalld setenforce 0部署master负载调度服务器 zyj86 安装ipvsadm keepalived yum install -y keepalived ipvsadm修改主节点配置 vim /etc/keepalived/keepalived.conf! Conf…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
