一、基础认知:类与对象是什么?
首先通过现实场景快速理解类和对象的核心关系:
- 对象:客观存在的具体事物,例如"杨过""杨康"(具体的人)、桌上的"电脑"、家里的"风扇"。每个对象都包含"属性"(描述特征,如姓名、年纪、风扇转速)和"行为"(描述动作,如人能说话、风扇能转动),本质是存储多组数据的容器。
- 类:对多个对象共同特征的抽象总结,例如将"杨幂""杨过"等具体的人抽象为"人类",将多台"电脑"抽象为"电脑类"。类如同制造物品的"模具"------比如塑料椅模具,通过模具可造出无数把具体的椅子(对象),因此类是创建对象的"模板",属于 ArkTS 中的自定义类型。
ArkTS 的 number
、string
等基础类型无法描述复杂事物(如员工需同时包含姓名、性别、工资等多个属性),而类作为自定义类型,正好解决这一需求。
二、类的定义:语法、规则与实战(以 Employee 类为例)
以"员工管理"为核心场景,详细演示类的定义过程,核心分为"文件创建""代码编写""关键规则"三部分。
1. 第一步:创建独立类文件(避免代码混乱)
文档建议不将类代码堆在页面文件中,正确做法是:
在项目 main/ets
目录下新建 common
或 model
文件夹,再创建 Employee.ets
文件------该文件专门存放员工类代码,方便后续复用和维护,目录结构如下:
css
src
└── main
└── ets
├── entryability
├── entrybackupability
└── model
└── Employee.ets
2. 第二步:类的完整代码(含字段、构造方法、方法)
Employee
类包含"员工属性""初始化逻辑""行为方法"三部分,代码如下:
typescript
// 用export导出类,让其他文件能调用
export class Employee {
// 1. 字段:描述员工的属性,需显式声明类型
name: string; // 姓名
sex: string; // 性别
sal: number; // 工资(注意:避免笔误成sale,否则会报错)
comm: number; // 奖金
// 2. 构造方法:初始化字段
// 参数顺序要和字段对应,用this.给字段赋值(必须加this.,否则找不到字段)
constructor(name: string, sex: string, sal: number, comm: number) {
this.name = name;
this.sex = sex;
this.sal = sal;
this.comm = comm;
}
// 3. 方法:描述员工的行为,不用写function关键字
// 方法1:展示员工完整信息
show() {
console.log("员工信息:", this.name, this.sex, this.sal, this.comm);
}
// 方法2:计算月收入(工资+奖金)
getIncome() {
return this.sal + this.comm; // 直接返回计算结果
}
}
实用技巧
- 快捷生成构造方法 :右键代码区 →
Generate
→Constructor
→ 选中需初始化的字段(name
/sex
/sal
/comm
),可自动生成赋值代码,无需手动编写。 - 字段初始化的另一种方式 :若属性值固定,可直接给默认值(如
name: string = "PLC"
),但文档更推荐构造方法(动态传参更灵活)。
三、对象的创建与使用:从导入到测试验证
定义好类后,需在页面中创建对象并测试,按"导入类""创建对象""调用方法""查看日志"四步流程操作。
1. 导入 Employee 类(解决"找不到类"问题)
文档强调:若要在页面文件(如 Index.ets
)中使用 Employee
类,必须先导入,否则会报"找不到变量"错误。导入语法如下:
typescript
// pages/Index.ets
// 导入语法:import { 类名 } from "文件相对路径"
import { Employee } from "../model/Employee"
// 也可以给类起别名,比如 import { Employee as EMP },后续用EMP创建对象
2. 创建对象与调用方法
通过 new 类名(参数)
创建对象,文档以"员工阿牛"为例,参数需与构造方法的"姓名→性别→工资→奖金"顺序完全匹配,否则报错:
typescript
import { Employee } from "../model/Employee"
@Entry
@Component
struct Index {
build() {
Column() {
// 按钮点击触发对象测试
Button('测试员工对象').onClick(() => {
// 1. 新建员工对象:阿牛,男,工资8000,奖金0
const emp = new Employee('阿牛', '男', 8000, 0);
// 2. 调用对象的方法
emp.show(); // 调用show(),打印阿牛的信息
const income = emp.getIncome(); // 调用getIncome(),计算月收入
console.log('阿牛月收入:', income); // 打印收入结果
})
}
.width('100%')
.height('100%')
}
}
3. 测试结果
运行项目后点击"测试员工对象"按钮,日志会输出以下内容,与代码逻辑完全一致:
四、访问修饰符:控制属性隐私(文档中的安全技巧)
为保护敏感属性(如员工工资),需用"访问修饰符"限制外部访问,核心分为 public
和 private
两种。
1. 修饰符规则对比
修饰符 | 访问范围 | 默认规则 |
---|---|---|
public |
类内部、外部(其他文件)均可访问 | 未写修饰符时,默认是 public |
private |
仅类内部可访问,外部无法直接修改/查看 | 需手动添加 private 关键字 |
2. 实战:保护员工工资
需求:员工工资不允许外部直接修改,需通过指定方法访问或修改,且修改时需校验"工资不低于 5000"。修改后的 Employee
类代码如下:
typescript
export class Employee {
name: string;
sex: string;
private sal: number; // 改成private,外部无法直接访问
comm: number;
constructor(name: string, sex: string, sal: number, comm: number) {
this.name = name;
this.sex = sex;
this.sal = sal;
this.comm = comm;
}
// 获取工资:外部只能通过这个方法查看工资
getSal() {
return this.sal;
}
// 修改工资:加校验,低于5000不允许改
setSal(newSal: number) {
if (newSal < 5000) {
console.log('工资不能低于5000!');
return;
}
this.sal = newSal;
}
// show()、getIncome()方法不变...
}
3. 外部访问方式
typescript
const emp = new Employee('阿牛', '男', 8000, 0);
console.log('当前工资:', emp.getSal()); // 正确:输出8000
emp.setSal(9000); // 正确:工资改成9000
emp.setSal(4000); // 错误:日志提示"工资不能低于5000!"
通过这种方式,可避免工资被随意修改,安全性更高。
五、ArkTS 新版本坑点:禁止无类型对象字面量
新版本 ArkTS 不允许直接定义"无类型的对象字面量",必须关联明确的类或接口,否则报错。
1. 错误写法
typescript
// ❌ 报错:对象文字必须与某个显式声明的类或接口对应
let obj = { name: '阿牛', sal: 8000, comm: 0 };
2. 正确写法
方案 1:通过 new 创建对象(推荐)
直接用类的构造方法创建,符合类型要求:
typescript
let obj = new Employee('阿牛', '男', 8000, 0);
方案 2:指定类类型
如果类未自定义构造方法(使用默认构造),可指定类型后用字面量赋值,例如定义"球类":
typescript
export class Ball {
size: number;
name: string;
}
// 正确:指定Ball类型,再用字面量赋值
let ball: Ball = { size: 10, name: '篮球' };
学习引导
欢迎大家系统学习鸿蒙开发,深入掌握类和对象、继承多态等 ArkTS 面向对象核心技术,拿下鸿蒙基础、高级开发者证书。可加入鸿蒙班一起从入门到精通,班级链接:点击免费加入
ArkTS 类和对象是鸿蒙面向对象开发的"骨架",无论是员工信息管理这种基础数据封装,还是复杂项目里的模块复用、代码解耦,都离不开它的扎实运用。希望本文的实战讲解能帮你理清类与对象的逻辑,在实际开发中写出更规整、更易维护的代码。如果有疑问或实战心得,欢迎在评论区交流 (๑・̀ㅂ・́)و✧!