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

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…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...