初识arkts2

类声明引入一个新类型,并定义字段,方法和构造函数

属性 必须要给初始值

constructor():构造函数

定义类后,可以使用关键字new创建实例

export class PersonStudent{firstName:string=''//名lastName:string=''//姓//constructor():构造函数:给属性初始值,初始化属性// constructor() {//   console.log('无参函数')// }constructor(firstName:string='',lastName:string='') {this.firstName=firstNamethis.lastName=lastName}//函数,不能写functionfullName(){//this调用自己的属性return this.lastName+this.firstName}
}
字段

字段时直接在类中声明的某种类型的变量

类可以具有实例字段或者静态字段

实例字段

要访问实例函数,需要使用类的实例

//实例字段
let p:PersonStudent=new PersonStudent('z','s')
//实例字段,通过new对象之后进行访问的字段
p.firstName='啧啧啧';
静态函数

使用关键字static将字段声明为静态。

要访问静态字段,需要使用类名

构造函数不允许使用静态字段

class person3{//静态字段:staticstatic firstName:string=''lastName:string=''// static constructor() {// }
}
静态函数

不支持this,无法直接访问非静态字段/函数

静态字段使用类名进行访问

class person3{a2(){}a3(){this.a2()}//静态函数static a(num1:number,num2:number){person3.firstName='张三'//不支持this,无法直接访问非静态字段/函数// this.lastName='aa'//无法直接访问函数// a2();return num1+num2}
}
//不用new对象进行访问
person3.firstName='ss'
//静态访问a()
person3.a(1,2)
继承

一个类可以继承另一个类·,继承类继承父类的字段和方法,但不继承构造函数。继承可以新增定义字段和方法,也可以覆盖其父类的方法

继承extends

子类 只支持单继承(只能继承一个父类)

必须调用父类的有参的构造函数,构造函数必须调用,但不能继承

关键字super可用于访问父类的实例字段、实例方法和构造函数。在实现子类功能时,可以通过该关键字从父类中获取所需接口

//父类
class Pet{name:string=''sex:string=''static age:number=0constructor(name:string,sex:string) {this.name=namethis.sex=sex//不能使用静态 static age:number=0}//函数show(){return `昵称:${this.name},性别:${this.sex}`}
}
//子类
class Dog extends Pet{constructor(name:string,sex:string) {//关键词:supersuper(name,sex)}//子类自己的属性type:string=''//重写show(){//方法不一样,结果一样return super.show()+'品种:'+this.type// return `昵称:${this.name},性别:${this.sex},品种:${this.type}`}a(){this.show()//子类super.show()//父类}
}
let pe=new Pet('张三','男')
//当子类的函数和父类的函数重名,会调用子类的函数
pe.show()
重写

子类重写父类的函数

要求:1.方法名相同

2.参数类型相同

3.返回值类型相同,或者其子类

show(){return super.show()+'品种:'+this.typereturn `昵称:${this.name},性别:${this.sex},品种:${this.type}`}
重载

同一个类中,方法名相同,参数列表不同,返回值类型相同

class Over{//重载aa(x:number):voidaa(x:string,k:number):voidaa(x:number|string,k?:number):void{}
}
class Oo extends  Over{aa(x:number):voidaa(x:string):voidaa(x:number|string):void{}
}
可见性修饰符

public修饰的类成员在程序的任何可访问该类的地方都是可见的

private修饰的成员不能再声明该声明的类之外访问

protected修饰符的作用与private修饰符非常相似,不同点是protected修饰的成员允许在子类中访问

class Aa{//public:共有的public  a1:string=''// protected 受保护的:本类和子类中使用protected  a2:string=''//private私有的private a3:string=''}
class Bb extends  Aa{show(){this.a2='asd'}
}
let aa=new Aa()
let bb=new Bb()
aa.a1;

getter和setter可以用提供对对象属性的受控访问

//可见性修饰
class pri{private _a1: stringpublic set a1(value: string) {this._a1 = value}public get a1(): string {return this._a1}private _a2: stringpublic set a2(value: string) {this._a2 = value}public get a2(): string {return this._a2}constructor(a1: string, a2: string) {this._a1 = a1this._a2 = a2}}
let p1=new pri('1','2');
p1.a1='a'
Record类型的对象字面量

泛型Record<k,v> 键值对

let map:Record<string,string>={'name':'张三','sex':'男','color':'黄'
}
let names=map['name'];
class Stu{name:string=''age:number=0
}
//Record 存数据,键值对数据
let map2:Record<string,Stu>={'张三':{name:'张三',age:18},'李四':{name:'李四',age:18},'李五':{name:'李五',age:18},'李六':{name:'李六',age:18},'李其':{name:'李其',age:18},
}
let s:Stu=map2['张三'];

接口

接口声明引入新类型,接口是定义代码协定的常见方式

接口通常包含属性和方法的声明

//接口
interface Stus{//接口中的方法,没有方法体(方法的实现)eat():voidstudy():number
}
//(实现类)实现接口,必须重写接口中的方法
class Stu1 implements Stus{eat(): void {console.log('学生在吃')}study(): number {console.log('学生在学习')return 100}
}
接口属性

接口的属性会在实现类中默认隐式生成getter/setter方法

interface  Stu2{name:stringsex:stringeat():voidstudy():number
}
class Stu3 implements Stu2{name: string=''sex: string=''eat(): void {throw new Error('Method not implemented.')}study(): number {throw new Error('Method not implemented.')}}
let stu3=new Stu3()
stu3.name='123'
接口继承

接口可以继承其它接口

继承接口包含被继承接口的所有属性和方法,还可以添加总结的属性和方法

interface Inte1{a():void
}
interface  Inte2 extends Inte1{b():void
}
class Imp1 implements Inte2{b(): void {throw new Error('Method not implemented.')}a(): void {throw new Error('Method not implemented.')}
}

实现多个接口

interface A1{a():void
}
interface B1{b():void
}
class C1 implements A1,B1{b(): void {throw new Error('Method not implemented.')}a(): void {throw new Error('Method not implemented.')}}
多态的实现方法,同一个方法在不同条件得到不同的结果
继承中的多态
接口实现的多态和继承实现的多态没有区别
class Pet{//父类name:string=''play():void{console.log('玩耍')}
}
class Dog extends Pet{//子类play():void{console.log('狗踢皮球')}
}
class Cat extends Pet{//子类play():void{console.log('猫玩狗')}
}
// 1.以父类作为形参
function play(pet:Pet){pet.play()
}
play(new Cat())
play(new Dog())
// 2.以父类作为返回值
function ly():Pet{let num=Math.random()*10if(num>5){return new Dog()}else {return new Cat()}
}
泛型

泛型类型和函数允许创建的代码在各种类型上运行,而不仅支持单一类型

泛型的通配符

泛型 T:type类,

K:key ,

V:value,

E:element集合,

N:number

?:不确定的类型

class Fx<E>{a(e:E):void{console.log(`${e}`)}
}
let fx=new Fx<number[]>();
fx.a([1,2])
泛型函数
//返回数字数组的最后一个元素
function lastGet(x:number[]):number{return x[x.length-1]
}
//调用
let aa=lastGet([1,2,3,4])
//返回任意类型数组的最后一个元素
function getLast<T>(x:T[]):T{return x[x.length-1]
}
//调用
let a2=getLast<string>(['1','2','as'])

空安全

非空断言运算符

应用于可空类型的值时,它编译时类型变为非空类型

export class A{a:number=0
}
export function fc(aa:A|null){// aa?.a=9console.log(`${aa!.a}`)//非空断言}
空值合并运算符

空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined,

如果是,则表达式的结果为右侧表达式,否则,结果为左侧表达式

export function  hb(str:string|null){// return (str!=null && str!=undefined)?str:'asd'//如果结果是null或undef,结果会是'asd'return str ?? 'asd'
}
可选链

在访问对象属性时,如果该属性是undefined或者null,可选链运算符会返回undefined。

export class A{a:number=0
}
export function fc(aa:A|null){// aa?.a=9//可选链console.log(`${aa?.a}`)}
导出:export
静态导入

导入声明用于导入其他模块导出的实体,并在当前模块中提供其绑定,导入声明由两部分组成

1.导入路径,用于指定导入的模块

2.导入绑定,用于定义导入的模块中的可用实体集和使用形式

动态导入

import()语法通常称为动态导入,是一种类似函数的表达式,用来动态导入模块

as 别名,把A改为aaa

import { promptAction } from '@kit.ArkUI';//导入kit下单个模块接口
并发

在同一时间内,存在多个任务同时执行的情况。

对于多核设备,这些任务可能同时在不同cpu上并行执行

对于单核设备,多个并发任务不会在同一时刻并行执行

为了提升应用的响应速度与帧率,避免耗时任务对主线的影响,arkts提供了异步并发和多线程并发

异步并发

promise和async/await提供异步并发能力,是标准的JS异步语法

          console.log('任务1');setTimeout(() => {console.log('任务2');     }, 2000);console.log('任务3');console.log('任务4');console.log('任务5');console.log('任务6');console.log('任务7');

异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作

回调地狱
  setTimeout(() => {console.log(Math.random() + '');setTimeout(() => {console.log(Math.random() + '');setTimeout(() => {console.log(Math.random() + '');setTimeout(() => {console.log(Math.random() + '');setTimeout(() => {console.log(Math.random() + '');}, 1000);}, 1000);}, 1000);}, 1000);}, 1000);
Promise

Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。

promise有三种状态:

1.pending:进行中

2.fulfilled:已完成

3.rejected:已拒绝

promise对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected

//promise //resolve:成功,reject:失败let p1=new Promise((resolve,reject)=>{// 生成随机数,小于0.5失败,大于0.5成功let num=Math.random()if(num<0.5){reject('小于0.5')}else{resolve('成功:'+num)}});p1.then(data=>{console.log(data);}).catch(err=>{console.log(err);}).finally(()=>{console.log('最终执行');})

then用来处理resolve(成功)的数据 data成功后返回的数据

catch用来处理reject(失败)的数据 err失败后返回的数据

async

async函数 达到的效果是同步代码的效果

         function a(){}function b(){}function c(){}function d(){}function e(){a()b()c()d()}e()

async函数是一个返回promise对象的函数,用于表示一个异步·操作,在async函数内部,可以使用await关键字等待一个promise对象的解析,并返回解析值

模拟一个以同步执行异步操作的场景

  // 1.生成一个promisefunction p(){return new Promise((r,j)=>{setTimeout(() => {let num=Math.random()if(num>0.5){r(num)}else{j(-1)}}, 1000);})}// 使用异步函数async function asy() {console.log('开始执行异步操作');try{let num1=await p()console.log(num1);let num2=await p()console.log(num2);} catch(error){console.log(error);}}console.log('主线程任务开始');asy()

此操作在DevEco Studio中使用

export function p():Promise<number>{return new Promise((r,j)=>{setTimeout(() => {let num=Math.random()if(num>0.5){r(num)}else{j('拒绝,你是个好人')}}, 1000);})
}
export async function asy() {console.log('开始执行异步操作');try{let num1=await p()console.log(num1.toString());let num2=await p()console.log(num2.toString());} catch(error){console.log(error);}
}
asy()

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

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

相关文章

数字排列.

题目描述 小明负责公司年会&#xff0c;想出一个趣味游戏&#xff1a; 屏幕给出 1 ~ 9 中任意 4 个不重复的数字&#xff0c;大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 N 位置的数字&#xff0c;其中 N 为给出数字中最大的&#xff08;如果不到这么多数字则…

机器学习基础06_梯度下降

目录 一、为什么使用梯度下降 二、什么是梯度下降 三、为什么要用梯度下降 四、怎么进行梯度下降 1、微分 1.单变量的微分 2.多变量的微分 2、梯度 3、步骤 (1)学习率α (2)梯度(导数)前的负号 4、实例实现 五、sklearn梯度下降 一、为什么使用梯度下降 前面利用正…

ELK8.15.4搭建开启安全认证

安装 Elastic &#xff1a;Elasticsearch&#xff0c;Kibana&#xff0c;Logstash 另外安装一个收集器filebeat 通过二进制安装包进行安装 创建一个专门放elk目录 mkdir /elk/ mkdir /elk/soft下载 es 、kibana、Logstash、filebeat二进制包 cd /elk/softwget https://art…

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。 接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&#xff0c;并且每个子串都是回文串…

YOLO入门教程(三)——训练自己YOLO11实例分割模型并预测【含教程源码+一键分类数据集 + 故障排查】

目录 引言前期准备Step0 环境部署1.安装OpenCV2.安装Pytorch3.安装Ultralytics Step1 打标训练Step2 格式转换Step3 整理训练集Step4 训练数据集4.1创建yaml文件4.2训练4.3预测4.4故障排查4.4.1OpenCV版本故障&#xff0c;把OpenCV版本升级到4.0以上4.4.2NumPy版本故障&#xf…

计算机网络(12)介质访问控制

ok通过前面的学习我们已经知道数据链路层提供的服务有帧封装&#xff0c;物理地址&#xff0c;流量控制&#xff0c;错误控制&#xff0c;访问控制。今天就来记录最后的访问控制。 介质访问控制 (MAC)详解 介质访问控制&#xff08;Media Access Control&#xff0c;简称 MAC&…

鸿蒙系统下使用AVPlay播放视频,封装播放器

鸿蒙系统下使用AVPlay开发一款视频播放器流程 一. 申请权限 申请相关权限&#xff0c;主要是读取存储卡权限&#xff0c;方便后面扫描视频用&#xff1a; getPermission(): void {let array: Array<Permissions> [ohos.permission.WRITE_DOCUMENT,ohos.permission.REA…

编程语言05:面向对象

一、定义 使用步骤&#xff1a; 1.定义类 2.创建对象 3.调用类的属性和方法 (一)定义类 1.java 一个java文件中可以定义多个class类&#xff0c;且只能一个类是public修饰&#xff0c;而且public修饰的类名必须成为代码文件名。 实际开发中建议还是一个文件定义一个…

低速接口项目之串口Uart开发(二)——FIFO实现串口数据的收发回环测试

本节目录 一、设计思路 二、loop环回模块 三、仿真模块 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计思路 串口数据的收发回环测试&#xff0c;最简单的硬件测试是把Tx和Rx连接在一起&#xff0c;然后上位机进行发送和接收测试&#xff0c;但是需要考虑到串…

机器学习系列----关联分析

目录 1. 关联分析的基本概念 1.1定义 1.2常用算法 2.Apriori 算法的实现 2.1 工作原理 2.2 算法步骤 2.3 优缺点 2.4 时间复杂度 2.5实际运用----市场购物篮分析 3. FP-Growth 算法 3.1 工作原理 3.2 算法步骤 3.3 优缺点 3.4 时间复杂度 3.5实际运用——网页点…

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL 二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和&#xff0c;给定一棵二叉树T&#xff0c;采用二叉链表存储&#xff0c;节点结构为 其中叶节点的weight域保存该节点的非负权值&#xff0c;设root为指向T的根节点的指针&#xff0c;设计求W…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型&#xff08;LLM&#xff09;的表示中&#xff0c;以提高其在图数据上自…

《SpringBoot、Vue 组装exe与套壳保姆级教学》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商&#xff0c;并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统&#xff0c;用户可以更加方便…

docker 容器运行Ruoyi-cloud

1&#xff0c;linux系统安装openjdk1.8,mvn,dokcer,node,git 2&#xff0c;拉取代码 1&#xff09;查看gitee仓库地址 2&#xff09;创建/app文件夹&#xff0c;进入app目录 mkdir /app cd /app 3&#xff09;clone代码 4&#xff09;修改配置文件中nacos地址 # 修改注…

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…

《Spring 数据访问:高效整合数据库与 ORM》

一、Spring 数据访问概述 Spring 在数据访问方面具有至关重要的地位&#xff0c;它为开发者提供了强大而高效的数据访问解决方案。 &#xff08;一&#xff09;强大的数据访问支持 Spring 提供了多种数据访问方式&#xff0c;以满足不同项目的需求。JDBC 是一种传统的数据访问…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…