一、先理解 Class(类)的核心概念
Class 是面向对象编程(OOP)的核心,你可以把它理解成创建对象的 "模板":
- 模板里定义了对象的「属性」(比如人的姓名、年龄)和「行为」(比如走路、说话);
- 用这个模板创建的具体实例,就是「对象」(比如 "张三" 这个具体的人)。
基础特性(新手必懂)
- 构造方法 :创建对象时自动执行,用于初始化属性(鸿蒙 / Java/TS 中常用
constructor或类名作为构造方法); - 成员变量 :类的属性(比如
name、age); - 成员方法 :类的行为(比如
sayHello()); - 继承 :子类可以复用父类的属性和方法(鸿蒙中用
extends)。
二、鸿蒙项目中 Class 的使用场景
鸿蒙(HarmonyOS)主流开发语言是 ArkTS(TypeScript 超集),下面以 ArkTS 为例,结合鸿蒙最常见的「自定义数据模型」场景,给一个完整可运行的案例。
场景说明
假设你要做一个鸿蒙应用的 "联系人列表",需要定义「联系人」类,包含姓名、电话、头像等属性,以及 "拨打电话""显示信息" 的方法。
完整案例(基于鸿蒙 Stage 模型)
步骤 1:定义 Class 类(联系人模型)
在项目的 entry/src/main/ets/model 目录下新建 Contact.ets 文件(建议把类放在 model 目录,符合鸿蒙最佳实践):
TypeScript
// Contact.ets - 联系人类(模板)
export class Contact {
// 1. 成员变量(属性)
name: string; // 姓名
phone: string; // 电话
avatar: string; // 头像路径(鸿蒙资源路径)
// 2. 构造方法:创建对象时初始化属性
constructor(name: string, phone: string, avatar: string = 'images/default_avatar.png') {
this.name = name; // this 指向当前对象
this.phone = phone;
this.avatar = avatar; // 头像默认值:项目默认头像
}
// 3. 成员方法(行为):拨打电话
callPhone(): void {
// 鸿蒙中调用系统电话能力(这里简化为打印,实际需申请权限)
console.log(`正在拨打 ${this.name} 的电话:${this.phone}`);
}
// 4. 成员方法:显示联系人完整信息
showInfo(): string {
return `姓名:${this.name},电话:${this.phone},头像:${this.avatar}`;
}
// 5. 静态方法(无需创建对象即可调用):验证手机号格式
static checkPhone(phone: string): boolean {
const reg = /^1[3-9]\d{9}$/; // 简单的手机号正则
return reg.test(phone);
}
}
步骤 2:在鸿蒙页面中使用这个 Class
在项目的 entry/src/main/ets/pages 目录下的 Index.ets 中使用该类:
TypeScript
// Index.ets - 鸿蒙主页面
import { Contact } from '../model/Contact'; // 导入自定义类
@Entry
@Component
struct Index {
// 定义联系人列表(存储 Contact 对象)
private contactList: Contact[] = [
new Contact('张三', '13800138000'), // 使用构造方法创建对象
new Contact('李四', '13900139000', 'images/lisi_avatar.png'), // 自定义头像
new Contact('王五', '12345678901') // 无效手机号(用于测试静态方法)
];
build() {
Column() {
Text('联系人列表')
.fontSize(30)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 20 });
// 遍历联系人列表,渲染每个联系人
List() {
ForEach(this.contactList, (item: Contact) => {
ListItem() {
Row() {
// 头像(鸿蒙 Image 组件)
Image($r('app.media.' + item.avatar.split('/')[1])) // 适配鸿蒙资源引用
.width(50)
.height(50)
.borderRadius(25)
.marginRight(10);
// 联系人信息
Column() {
Text(item.name)
.fontSize(20);
Text(item.phone)
.fontSize(14)
.fontColor(Color.Grey);
// 验证手机号并显示结果
Text(`手机号有效:${Contact.checkPhone(item.phone)}`)
.fontSize(12)
.fontColor(Contact.checkPhone(item.phone) ? Color.Green : Color.Red)
.marginTop(5);
}
// 拨打电话按钮
Button('拨打')
.marginLeft(20)
.onClick(() => {
item.callPhone(); // 调用对象的方法
})
}
.padding(10)
.width('100%')
}
})
}
.width('100%')
.height('80%')
}
.padding(20)
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center);
}
}
步骤 3:效果说明
- 运行鸿蒙模拟器后,页面会显示 3 个联系人;
- 每个联系人会显示姓名、电话、手机号有效性;
- 点击 "拨打" 按钮,控制台会打印 "正在拨打 XXX 的电话:XXXX";
- 王五的手机号是无效格式,会显示红色的 "手机号有效:false"。
关键说明(鸿蒙特有的注意点)
-
资源引用 :鸿蒙中图片资源需放在
entry/src/main/resources/media目录,代码中用$r('app.media.文件名')引用; -
权限(可选) :如果要实际调用系统电话,需在
module.json5中添加电话权限:json
TypeScript{ "module": { "abilities": [...], "requestPermissions": [ { "name": "ohos.permission.CALL_PHONE" } ] } } -
Class 与鸿蒙组件结合 :可以把 Class 对象绑定到鸿蒙的
ForEach、List等组件,实现数据驱动 UI。
三、拓展:Class 继承的案例(鸿蒙中常用)
如果需要定义「企业联系人」(继承普通联系人,新增 "公司名称" 属性),可以这样写:
TypeScript
// EnterpriseContact.ets
import { Contact } from './Contact';
export class EnterpriseContact extends Contact {
company: string; // 新增属性:公司名称
// 构造方法:调用父类构造方法 + 初始化子类属性
constructor(name: string, phone: string, company: string, avatar?: string) {
super(name, phone, avatar); // 调用父类构造方法
this.company = company;
}
// 重写父类方法:扩展显示信息
override showInfo(): string {
return `${super.showInfo()},公司:${this.company}`;
}
}
// 在页面中使用
// const enterpriseContact = new EnterpriseContact('赵六', '13700137000', '鸿蒙科技');
// console.log(enterpriseContact.showInfo());
// 输出:姓名:赵六,电话:13700137000,头像:images/default_avatar.png,公司:鸿蒙科技
总结
- Class 核心:是创建对象的模板,包含属性(成员变量)和行为(成员方法),构造方法用于初始化对象;
- 鸿蒙中使用 :
- 建议把 Class 放在
model目录,通过export/import复用; - 常用于定义数据模型(如联系人、商品),结合鸿蒙 UI 组件实现数据渲染;
- 建议把 Class 放在
- 关键特性 :继承(
extends)可复用父类逻辑,静态方法无需创建对象即可调用。