【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

news2024/12/23 1:45:54

序言:

本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。

笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正。

B站黑马的课程链接:鸿蒙课程介绍_哔哩哔哩_bilibili

往期笔记:

【01】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs基础语法与界面开发基础

【02】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-界面进阶与布局排布(附QQ登陆、得物、京东登陆综合案例+代码)

【03】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-更多布局(弹性/层叠)方式与界面开发综合(附飞狗卡片+B站卡片案例+实战开发支付宝界面+代码)

【04】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-ArkTs进阶运算符+状态管理(附综合案例美团购物车)

【05】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-条件渲染+if/switch判断与for/while循环(附计数器、京东加购案例)
【06】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-综合案例·生肖抽奖卡具体实现(类似支付宝集五福)
【07】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Swiper轮播组件与样式&结构重用  

【08】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Scroll容器与Tabs组件

目录

一.Class类

1.class类-属性方法

2.class类-构造函数

3.class类-定义方法&静态方法&静态属性

4.class类-继承extends和super关键字

5.class类-instanceof和typeof

6.class类-类的修饰符


一.Class类

1.class类-属性方法

1)简介:

类是用来 创建对象 模板。

同时类声明也会引入一个 新类型,可定义其 实例属性、方法和构造函数。

2)实例属性:

①用法:

class 类名{
  //1.实例属性(字段)
  //字段名、类型、初始值
  字段名1:类型='xxx'
  //可选字段可以不设置初始值
  字段名2?:类型
  //2.构造函数
  //3.方法
}
//使用类 实例化对象 基于类 创建对象
//可选字段在使用时需要配合使用 可选链操作符 避免出错
const p:类名 = new 类名()
p.字段名1
p?.字段名2

②实例代码:

class Cat{
  name:string = 'Tom'
  foods?:string
}
//基于类,创建对象
let c:Cat = new Cat()
c.name = '河马'
console.log('姓名',c.name)
console.log('食物',c.foods?.length)
//这个问号的意义在于,如果food真的有值则取其长度,如果没有值就取food本身,即为空
let z:Cat = new Cat()
z.name = '荷花'
z.foods = '河马'
console.log('姓名',z.name)
console.log('食物',z.foods?.length)

2.class类-构造函数

1)简介:

不同实例,将来需要有不同的字段初始值,就需要通过构造函数实现。

2)基本语法:

class 类{
  字段A:类型
  字段B:类型


  constructor(参数...) {
    //通过new 实例化的时候 会调用constructor
    //通过关键字this 可以获取到实例对象
  this.字段A = 参数
  }
}
const 实例化1 = new 类(参数...)
const 实例化2 = new 类(参数...)

3)基础实例代码:

class Food{
  name:string
  price:number
//希望有不同实例,有不同的字段初始值->构造函数
  constructor(name:string,price:number) {
    this.name=name
    this.price=price
  }
}
const f1 = new Food('西红柿鸡蛋',15)
const f2 = new Food('土豆炖鸡块',24)
console.log('名称:',f1.name,'价格:',f1.price)
console.log('名称:',f2.name,'价格:',f2.price)

4)进阶实例代码:

加入了一个interface接口,基于接口方便定义实例参数(无需按照顺序进行输入)

interface IFood{
  name:string
  price:number
  desc:string
}
class Food{
  name:string
  price:number
  desc:string
  //希望有不同实例,有不同的字段初始值->构造函数
  constructor(paramsObj:IFood) {
    this.name=paramsObj.name
    this.price=paramsObj.price
    this.desc =paramsObj.desc
  }
}
let  p1:Food = new Food({
  name:'西兰花',
  desc:'好吃',
  price:188
})
let  p2:Food = new Food({
  name:'黄瓜炒鸡蛋',
  desc:'清爽',
  price:3688
})
console.log('菜名:',p1.name,'价格:',p1.price,'描述:',p1.desc)
console.log('菜名:',p2.name,'价格:',p2.price,'描述:',p2.desc)

3.class类-定义方法&静态方法&静态属性

1)简介:

类中可以定义方法,并且在内部编写逻辑。

class 类名{
  方法名(参数...):返回值类型{
    //逻辑
    //可以通过this获取实例对象
}
}

2)实例代码:

class Person{
  name:string


  constructor(name:string) {
    this.name = name
  }
//定义方法
  sayHi(name:string){
    console.log(`你好${name},我是:${this.name}`)
  }
}
const p:Person = new Person('笨猪河马')
//方法调用
p.sayHi('可爱的荷花')

3)静态属性和静态方法:

①简介:

静态属性和静态方法不是给我们实例化对象添加的,是给类添加的,比如定义一个数字工具类中会有π=3.14,e=2.71

①语法:

class 类{
  static 字段:类型
  static 方法(){}
}
//使用
类.字段
类.方法()

②实例代码:

class Robot{
  //如果不设置值,默认是undefined
  static PI:number = 3.14
  static version:string = 'v10.12'
  //工具方法
  static getRandomNumber(){
    return Math.random()
  }
}
//无需实例化对象,直接调用类 没有new 也可以直接用
console.log('机器人版本:',Robot.version)
console.log('生成一个随机数:',Robot.getRandomNumber())
console.log('计算半径为5的圆的面积:',Robot.PI*5*5)

4.class类-继承extends和super关键字

1)简介:

我们在实际使用中各个类之间往往会有很多相似之处,比如说猫和狗,都是动物,我们就可以定义一个动物类作为猫类和狗类的父类。比如程序员和教师都有姓名、年龄、家庭住址、email,只不过能做的职业功能不同,我们就可以添加一个人类(含有姓名、年龄、家庭住址、email四个属性)作为他们的父类。

即把公共部分抽取出来,进行复用,我们的代码就会更加简洁高效。

class 父类{
  //字段
  //方法
  //构造函数
}


class 子类 extends 父类{
  //自己的字段(属性)
  //自己的方法
  //可以重写父类的方法
}

2)实例代码:

class Person{
  name:string
  age:number


  constructor(name:string,age:number) {
    this.name=name
    this.age=age
  }


  sayHi(){
    console.log('大家好!','我叫',this.name,'今年',this.age,'岁')
  }
}


class Student extends Person{
  grade:string


  constructor(name:string,age:number,grade:string) {
    //父类中的构造函数需要我们手动调用,子类可以访问父类的实例字段、实例方法和构造函数
    //此时需要手动调用super()构造函数,super.方法名() super.属性名
    super(name,age)
    //完成自己属性的初始化
    this.grade=grade
  }
  //子类中想要重写父类的方法,只需要提供同名的方法即可
  //比如学生想展示一下自己的英文水平
  sayHi(): void {
    console.log('Hello!','My name is',this.name,'Now year',this.age,',我的年级是',this.grade)
  }


  study(){
    console.log('我是学生,我爱学点小习')
  }




}
let s1:Student = new Student('河马',74,'大四')
s1.sayHi()
console.log('今年',s1.grade)
s1.study()


class Teacher extends Person{


}
let t1:Teacher=new Teacher('大卑老师',9999)
t1.sayHi()
class Worker extends Person{


}
let w1:Worker=new Worker('修水管的师傅',41)
w1.sayHi()

tips:关于super(),子类可以通过super访问父类的实例字段、实例方法和构造函数。

5.class类-instanceof和typeof

1)简介:

instanceof运算符可以用来检测某个对象是否是某个类的实例

typeof只能用于判断简单类型,如Boolean、string、number等简单类型

2)typeof实例代码:

console.log(typeof 111)
console.log(typeof true)
console.log(typeof 'abc')
class Person{


}
class Student extends Person{


}
let p:Person = new Person()
let s:Student = new Student()
console.log(typeof p)
console.log(typeof s)

我们在日志中会发现typeof判断简单类型都可以直接显示其类型,但用typeof去判断p和s会显示object

3)instanceof实例代码:

①需求:

定义一个父类→定义子类并继承父类→实例化子类并通过instanceof进行判断→判断数组是否为Array的实例

②代码:

class Person{


}
class Student extends Person{


}
class Worker{


}
let s:Student = new Student()
console.log('s和Student类的instanceof判断结果:',s instanceof Student)
console.log('s和Person类的instanceof判断结果:',s instanceof Person)
console.log('s和Worker类的instanceof判断结果:',s instanceof Worker)

③判断数组代码:

interface IObj{}
//判断一个变量是否存的是数组
let temp=[]
let temp2:IObj={}
//普通对象可以用数组判断
console.log('temp1是否是数组',temp instanceof Array)
//如果是调temp2这种接口里的方法就不能用数组去判断
console.log('temp2是否是数组',temp2 instanceof Array)

6.class类-类的修饰符

1)简介:

类的属性和方法可以通过修饰符来限制访问

修饰符包括:readonly、private、protected和public

省略不写默认为public

2)readonly实例代码:

class Cat{
  name:string
  age:number
  readonly legs:number=4


  constructor(name:string,age:number) {
    this.name=name
    this.age=age
  }
}
let c1=new Cat('小花',2)
c1.name='小美'
c1.legs=6 //会报错
console.log('姓名',c1.name)

3)private实例代码:

class Person{
  private name:string=''
  private age:number=0
}
class Student extends Person{
  sayHi(){
    console.log('访问私有的数据:',super.name)
//私有数据无法在外部(子类)中访问
  }
}

4)protected修饰符

①简介:

protected修饰符的作用与private修饰符非常相似

不同点是protect修饰的成员允许在派生类(子类)中访问

②代码演示:

class Person{
  protected  name:string=''
  private age:number=0
}
class Student extends Person{
  sayHi(){
    console.log('访问私有的数据:',super.name)
  }
}

用protected定义父类的name,一样的代码就可以访问了。

但是在外部访问,一样不允许访问。

class Person{
  protected  name:string=''
  private age:number=0
  constructor(name:string,age:number) {
    this.name=name
    this.age=age
  }
}
class Student extends Person{


  sayHi(){
    console.log('访问私有的数据:',super.name)
  }
}
let s1:Student =new Student('小华',18)
//外部
console.log('外部访问保护的数据:',s1.name)

感谢阅读。

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

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

相关文章

横排文字、图层蒙版-1(2024年09月30日)

2024年09月30日 记录_导读 2024年09月30日 10:13 关键词 优惠券 设计 图层 背景 元素 调整 画笔工具 颜色 大小 位置 复制 移动 添加涂层 多选 显示 PS 元素文件 隐藏 使用规则 Logo 全文摘要 通过在Photoshop中精心操作图层,包括复制、移动和调整设置&#xf…

自动驾驶系列—自动驾驶发展史介绍

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

CMU 10423 Generative AI:lec13/13.5(text-to-image models:三大类方法、评估标准、图像编辑原理)

1 文章目录 1 lec13和lec13.5概述2 Text-to-Image Generation 概念、主要方法、挑战、发展历程1. **基本概念**2. **主要技术方法**2.1. **生成对抗网络(GAN)**2.2. **自回归模型(Autoregressive Models)**2.3. **扩散模型&#x…

声纳技术24.1.19声纳定向方法

一、基本原理 本质:利用声程差和相位差 声程差: 时间差: 相位差: 二、最大值测向 原理:接收到的信号幅度最大时换能器或基阵的指向性来测量目标方位 优点:简单,利用人耳可判别目标性质&a…

单链表的增删改查(数据结构)

之前我们学习了动态顺序表,今天我们来讲一讲单链表是如何进行增删改查的 一、单链表 1.1、单链表概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2、链表与顺序表的…

大豆重测序二(同一领域互竞)-文献精读58

High-quality genome of a modern soybean cultivar and resequencing of 547 accessions provide insights into the role of structural variation 现代大豆品种的高质量基因组及对547个种质资源的重测序揭示结构变异的作用 大豆重测序-文献精读53 摘要 大豆提供蛋白质、油…

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中,我们制作了AB分区系统镜像,并成功通过uboot加载kernel以及d…

基于Springboot+Vue的美妆神域(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

基于STM32的智能停车管理系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据读取模块停车位控制模块OLED显示状态应用场景结论 1. 引言 智能停车管理系统旨在提高停车场的管理效率,减少车主寻找停车位的时间。该系统通过传感器实时监测停车…

Spring Boot技术在足球青训管理中的实践与挑战

摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…

深圳大学 Github 学生认证并免费使用 Copilot AI编程工具(超详细)

文章目录 01 注册学生邮箱并添加邮箱到Github1.1 注册学生邮箱1.2 绑定学生邮箱 02 修改 Github profile 信息03 申请学生认证[^2]04 配置 Copliot05 VS code 使用 Copilot 01 注册学生邮箱并添加邮箱到Github 1.1 注册学生邮箱 对于深圳大学的学生来说,学校已经帮…

【CSS in Depth 2 精译_042】6.4 CSS 中的堆叠上下文与 z-index(下)——深入理解堆叠上下文

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…

聊聊国内首台重大技术装备(2)

上次,介绍了《首台(套)重大技术装备推广应用指导目录(2024年版)》中介绍的硅外延炉,湿法清洗机,氧化炉,见文章: 《聊聊国内首台重大技术装备(1)》…

ESP32微信小程序SmartConfig配网

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ESP32&微信小程序SmartConfig配网 前言一、SmartConfig是什么?二、使用乐鑫官方的smart_config例子1.运行照片 三、微信小程序总结 前言 本人是酷爱ESP32S3这…

数据结构--包装类简单认识泛型

目录 1 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱,自动装箱和自动拆箱 2 什么是泛型 3 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 5 泛型的上界 5.1 语法 5.2 示例 5.3 复杂示例 8 泛型方法 8.1 定义语法 8.2 示例 总结 1 …

【web安全】——XSS漏洞

1.XSS漏洞基础 1.1.漏洞成因 XSS(Cross-site scripting)被称为跨站脚本攻击,由于与层叠样式表的缩写一样,因此被缩写为XSS.XSS漏洞形成的原因是网站/程序对前端用户的输入过滤不严格,导致攻击者可以将恶意的is/html代码注入到网页中&#x…

LeetCode[中等] 763. 划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路 贪心…

JavaWeb酒店管理系统(详细版)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

QT 界面编程中使用协程

QT 界面编程中使用协程 一、概述二、集成2.1、编译 Acl2.2、将 Acl 库集成到 QT 项目中2.3、开始编写代码2.3.1、QT 程序初始化时初始化 Acl 协程2.3.2、在界面中创建协程2.3.3、界面程序退出前需要停止协程调度2.3.4、在界面线程中下载数据2.3.5、在协程中延迟创建窗口 2.4、效…

8642 快速排序

### 思路 快速排序是一种分治算法,通过选择一个基准元素将数组分成两部分,然后递归地对每部分进行排序。每次分区后输出当前排序结果。 ### 伪代码 1. 读取输入的待排序关键字个数n。 2. 读取n个待排序关键字并存储在数组中。 3. 对数组进行快速排序&am…