大家好,我是Feri,13年+开发老兵,带过团队创过业,深耕嵌入式、鸿蒙、AI和Java,专注帮程序员少走弯路!
在鸿蒙开发中,很多新手会陷入“代码堆一堆,改时泪两行”的困境——其实只要用好面向对象编程(OOP),把数据和逻辑“打包”起来,代码就能变整洁、好维护。
今天就用最生活化的例子,带你吃透OOP的核心:类与对象,搭配鸿蒙实战场景,趣味拉满,君志所向,一往无前!
一、先搞懂:OOP的核心就是“少重复、好管理”
面向对象编程哪有那么玄乎?本质就是把现实世界的“东西”,搬进代码里变成“对象”,再用“类”做模板批量生产——核心目的就两个: ✅ 减少重复代码:比如多个用户的信息结构一样,不用写多套代码; ✅ 让代码更规整:数据(比如用户账号)和功能(比如登录)绑在一起,找的时候一眼就能看到。
在鸿蒙开发里,不管是做记账App、学生管理工具,还是复杂的智能家居控制,OOP都能帮你把杂乱的逻辑理清楚,后续改需求、加功能也不用“牵一发而动全身”。
二、类与对象:像“蛋糕模具”和“成品蛋糕”一样好理解
很多人分不清“类”和“对象”,其实用一个生活例子就能秒懂:
- 类 = 蛋糕模具:定义了蛋糕的“统一标准”——比如都是圆形、有3层、能加奶油(对应类的属性和功能);
- 对象 = 成品蛋糕:用模具做出来的具体蛋糕,每个都有自己的口味(比如草莓味、巧克力味)、装饰(对应对象的独立属性值),但都能实现“被吃掉”的功能(对应类的方法)。
在鸿蒙开发中:
- 比如做记账App,“账单类”就是模具——定义了所有账单都要有“金额、时间、消费类型”这些属性,以及“添加、删除、统计”这些功能;
- 你今天花20元买奶茶的账单、明天花100元吃火锅的账单,就是“账单类”的两个对象——各自有独立的金额、时间,但都能调用“添加到账本”的功能。
三、类的语法:3部分搞定“万能模板”
一个完整的类,就像一个“装备齐全的模具”,包含3个核心部分:属性(字段)、构造函数、方法(函数) ,用ArkTS(鸿蒙主力语言)写起来超简单,咱们用“学生类”做例子,逐部分拆解:
3.1 属性(字段):对象的“专属装备”
属性就是类里存储数据的变量,比如学生的学号、姓名、年龄——相当于蛋糕模具上的“凹槽”,决定了成品蛋糕能有哪些“特征”。
语法:属性名: 数据类型 = 初始值;(鸿蒙用强类型,必须指定数据类型)
示例:
export class Student {
// 学号(字符串类型,初始为空)
studentNo: string = '';
// 姓名(字符串类型,初始为空)
name: string = '';
// 年龄(数字类型,初始为0)
age: number = 0;
// 性别(字符串类型,初始为"未知")
gender: string = '未知';
}
3.2 构造函数:对象的“出生说明书”
构造函数是用来“创建对象”的特殊方法——相当于用模具做蛋糕时,往模具里加原料(比如面粉、鸡蛋)的步骤,能在对象创建时,直接给属性赋初始值,不用后续再一个个设置。
语法:constructor(参数名: 数据类型, ...) { this.属性名 = 参数名; }
示例:给学生类加构造函数,创建学生时直接传入学号、姓名等信息:
export class Student {
studentNo: string = '';
name: string = '';
age: number = 0;
gender: string = '未知';
// 构造函数:创建对象时必须传入这4个参数
constructor(studentNo: string, name: string, age: number, gender: string) {
this.studentNo = studentNo; // 把传入的学号赋值给类的studentNo属性
this.name = name; // 把传入的姓名赋值给name属性
this.age = age; // 把传入的年龄赋值给age属性
this.gender = gender; // 把传入的性别赋值给gender属性
}
}
💡 小技巧:如果没写构造函数,系统会自动给一个“无参构造函数”,创建对象时再手动给属性赋值也可以~
3.3 方法(函数):对象的“专属技能”
方法是类里封装的功能,比如学生能“学习”、能“展示自己的信息”——相当于蛋糕能“被吃掉”、能“被装饰”,是对象能执行的操作。
语法:方法名(参数名: 数据类型, ...): 返回值类型 { 功能代码; }
示例:给学生类加两个方法,学习和展示信息:
export class Student {
studentNo: string = '';
name: string = '';
age: number = 0;
gender: string = '未知';
constructor(studentNo: string, name: string, age: number, gender: string) {
this.studentNo = studentNo;
this.name = name;
this.age = age;
this.gender = gender;
}
// 学习方法:无参数、无返回值,打印一句话
study(subject: string) {
console.log(`${this.name} 正在疯狂学习 ${subject}!真的没有摸鱼哦~`);
}
// 展示信息方法:无参数、返回字符串,返回学生的完整信息
getStudentInfo(): string {
return `学号:${this.studentNo},姓名:${this.name},年龄:${this.age}岁,性别:${this.gender}`;
}
}
完整类模板:直接复制能用
把上面三部分整合,一个标准的鸿蒙类模板长这样,直接套就行:
export class 类名 {
// 1. 属性(字段)
属性1: 数据类型 = 初始值;
属性2: 数据类型 = 初始值;
...
// 2. 构造函数(可选)
constructor(参数1: 数据类型, 参数2: 数据类型, ...) {
this.属性1 = 参数1;
this.属性2 = 参数2;
...
}
// 3. 方法(可选)
方法1(参数1: 数据类型, ...): 返回值类型 {
功能代码;
}
方法2(参数1: 数据类型, ...): 返回值类型 {
功能代码;
}
...
}
四、类的使用:3步搞定“创建对象+调用功能”
定义好类之后,用起来超简单,就像“拿模具做蛋糕+用蛋糕做事情”,分3步:
4.1 第一步:导入类(把模具拿到手)
在需要使用类的文件里,用import导入定义好的类,路径要写对(比如类在model/Student.ts里):
// 导入Student类,路径根据自己的项目结构调整
import { Student } from '../model/Student';
4.2 第二步:创建对象(用模具做蛋糕)
用new关键字调用构造函数,创建类的实例(对象),就像用模具做出具体的蛋糕:
// 创建一个学生对象:学号001、姓名"小明"、年龄18、性别"男"
const xiaoMing: Student = new Student('001', '小明', 18, '男');
4.3 第三步:调用属性和方法(用蛋糕做事)
通过“对象名.属性名”访问/修改属性,“对象名.方法名()”调用方法,就像给蛋糕加装饰、吃蛋糕:
// 1. 修改属性:小明年龄长了1岁
xiaoMing.age = 19;
// 2. 调用方法:让小明学习鸿蒙开发
xiaoMing.study('HarmonyOS开发');
// 3. 调用方法:获取小明的完整信息并打印
const xiaoMingInfo = xiaoMing.getStudentInfo();
console.log('小明的信息:', xiaoMingInfo);
鸿蒙实战:在页面中使用类(学生信息录入)
结合鸿蒙UI组件,做一个简单的学生信息录入页面,完整代码示例:
import { Student } from '../model/Student';
@Entry
@Component
struct StudentManagerPage {
@State message: string = '学生信息管理';
// 定义学生对象(用无参构造函数创建)
@State currentStudent: Student = new Student('', '', 0, '未知');
build() {
Column() {
Text(this.message)
.fontSize(24)
.fontWeight(700)
.margin(20);
// 录入学号
Row({ space: 10 }) {
Text('学号:')
.fontSize(16);
TextInput({ placeholder: '请输入学号' })
.type(InputType.Number)
.width('80%')
.onChange(value => {
// 实时更新对象的学号属性
this.currentStudent.studentNo = value;
});
}
.margin(10);
// 录入姓名
Row({ space: 10 }) {
Text('姓名:')
.fontSize(16);
TextInput({ placeholder: '请输入姓名' })
.width('80%')
.onChange(value => {
// 实时更新对象的姓名属性
this.currentStudent.name = value;
});
}
.margin(10);
// 查看学生信息按钮
Button('查看学生信息')
.width('80%')
.margin(20)
.onClick(() => {
// 调用对象的方法,获取信息并打印
const studentInfo = this.currentStudent.getStudentInfo();
console.log('当前学生信息:', studentInfo);
// 调用学习方法
this.currentStudent.study('ArkTS编程');
});
}
.height('100%')
.width('100%')
.padding(20);
}
}
运行之后,输入学号和姓名,点击按钮就能在控制台看到学生信息和学习日志,是不是很直观?
五、鸿蒙开发中的实际应用场景:不止是学生类
类与对象在鸿蒙里的用法太多了,举两个高频场景,你一看就懂:
场景1:记账App(账单类)
// 定义账单类
export class Bill {
id: string = ''; // 账单ID
amount: number = 0; // 金额
time: string = ''; // 消费时间
type: string = ''; // 消费类型(比如餐饮、交通)
constructor(id: string, amount: number, time: string, type: string) {
this.id = id;
this.amount = amount;
this.time = time;
this.type = type;
}
// 添加账单到本地存储
saveBill() {
// 调用鸿蒙本地存储API,保存账单数据
console.log(`账单${this.id}已保存:${this.amount}元,${this.type}`);
}
// 统计本月该类型的总消费
static getTotalByType(bills: Bill[], type: string): number {
return bills.filter(bill => bill.type === type).reduce((sum, bill) => sum + bill.amount, 0);
}
}
使用时,每次添加账单就创建一个Bill对象,调用saveBill()保存,统计时调用静态方法getTotalByType(),逻辑清晰又好维护。
场景2:智能家居控制(设备类)
// 定义智能灯类
export class SmartLight {
deviceId: string = ''; // 设备ID
name: string = ''; // 设备名称(比如客厅灯)
isOn: boolean = false; // 是否开启
constructor(deviceId: string, name: string) {
this.deviceId = deviceId;
this.name = name;
}
// 开灯
turnOn() {
this.isOn = true;
console.log(`${this.name}已开启`);
}
// 关灯
turnOff() {
this.isOn = false;
console.log(`${this.name}已关闭`);
}
}
创建多个SmartLight对象(客厅灯、卧室灯),分别调用turnOn()和turnOff(),就能实现多设备控制,这就是鸿蒙智能家居App的核心逻辑之一!
六、总结:类与对象的核心要点(记住3句话)
- 类是“模板”,定义属性和方法;对象是“成品”,是类的具体实例;
- 用构造函数创建对象,用“对象名.属性”“对象名.方法()”操作对象;
- 鸿蒙开发中,用类封装数据和逻辑,能让代码更整洁、易复用,后续改需求不用乱翻代码。
如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:developer.huawei.com/consumer/cn…
类与对象是面向对象编程的基础,掌握之后,后续学习继承、多态这些高级特性会轻松很多。
我一直觉得:编程不是死记语法,而是把现实逻辑翻译成代码——类与对象,就是最直观的“翻译工具”。