零基础搞定 ArkTS 类与对象!保姆级教程:定义→创建→测试全流程 + 代码示例

一、基础认知:类与对象是什么?

首先通过现实场景快速理解类和对象的核心关系:

  • 对象:客观存在的具体事物,例如"杨过""杨康"(具体的人)、桌上的"电脑"、家里的"风扇"。每个对象都包含"属性"(描述特征,如姓名、年纪、风扇转速)和"行为"(描述动作,如人能说话、风扇能转动),本质是存储多组数据的容器。
  • :对多个对象共同特征的抽象总结,例如将"杨幂""杨过"等具体的人抽象为"人类",将多台"电脑"抽象为"电脑类"。类如同制造物品的"模具"------比如塑料椅模具,通过模具可造出无数把具体的椅子(对象),因此类是创建对象的"模板",属于 ArkTS 中的自定义类型。

ArkTS 的 numberstring 等基础类型无法描述复杂事物(如员工需同时包含姓名、性别、工资等多个属性),而类作为自定义类型,正好解决这一需求。

二、类的定义:语法、规则与实战(以 Employee 类为例)

以"员工管理"为核心场景,详细演示类的定义过程,核心分为"文件创建""代码编写""关键规则"三部分。

1. 第一步:创建独立类文件(避免代码混乱)

文档建议不将类代码堆在页面文件中,正确做法是:

在项目 main/ets 目录下新建 commonmodel 文件夹,再创建 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;  // 直接返回计算结果
  }
}

实用技巧

  • 快捷生成构造方法 :右键代码区 → GenerateConstructor → 选中需初始化的字段(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. 测试结果

运行项目后点击"测试员工对象"按钮,日志会输出以下内容,与代码逻辑完全一致:

四、访问修饰符:控制属性隐私(文档中的安全技巧)

为保护敏感属性(如员工工资),需用"访问修饰符"限制外部访问,核心分为 publicprivate 两种。

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 类和对象是鸿蒙面向对象开发的"骨架",无论是员工信息管理这种基础数据封装,还是复杂项目里的模块复用、代码解耦,都离不开它的扎实运用。希望本文的实战讲解能帮你理清类与对象的逻辑,在实际开发中写出更规整、更易维护的代码。如果有疑问或实战心得,欢迎在评论区交流 (๑・̀ㅂ・́)و✧!

相关推荐
程序员潘Sir8 小时前
HarmonyOS实现快递APP自动识别地址
harmonyos·鸿蒙
萌虎不虎8 小时前
【鸿蒙(openHarmony)自定义音频播放器的开发使用说明】
华为·音视频·harmonyos
李洋-蛟龙腾飞公司8 小时前
HarmonyOSAI编程万能卡片生成(一)
华为·ai编程·harmonyos
HarmonyOS_SDK10 小时前
打破场景边界,支付宝联合实况窗提供全新出行服务体验
harmonyos
安卓开发者10 小时前
鸿蒙NEXT应用数据持久化全面解析:从用户首选项到分布式数据库
数据库·分布式·harmonyos
森之鸟11 小时前
开发中使用——鸿蒙播放本地mp3文件
华为·harmonyos
前端世界12 小时前
HarmonyOS 数据处理性能优化:算法 + 异步 + 分布式实战
算法·性能优化·harmonyos
HarmonyOS小助手13 小时前
【案例+1】HarmonyOS官方模板优秀案例 第7期:金融理财 · 记账应用
harmonyos·鸿蒙·鸿蒙生态