HarmonyOS 鸿蒙Next:值类型变量和引用类型变量赋值解析

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:值类型变量和引用类型变量赋值解析

基于上述原理,在使用值类型变量和引用类型变量时,会存在一些行为差异,以下几点值得注意:

  1. 在给值类型变量赋值时,一般会产生拷贝操作,且原来绑定的数据/存储空间被覆写(没有说清楚,c2是把c1的数据及存储空间复制了一份,c2原来的数据/存储空间被覆写,而c1的数据/空间不会被改变,)。在给引用类型变量赋值时,只是改变了引用关系,原来绑定的数据/存储空间不会被覆写(是s2之前的数据/存储空间不会被覆写,而s2变成了s1了,)。
  2. 用 let 定义的变量,要求变量被初始化后都不能再赋值。对于引用类型,这只是限定了引用关系不可改变,但是所引用的数据是可以被修改的。

在仓颉编程语言中,基础数据类型和 struct 等类型属于值类型,而 class 和 Array 等类型属于引用类型。

例如,以下程序演示了 struct 和 class 类型变量的行为差异:

  1. struct Copy {
  2. var data = 2012
  3. }
  4. class Share {
  5. var data = 2012
  6. }
  7. main() {
  8. let c1 = Copy()
  9. var c2 = c1 //
  10. c2.data = 2023 //只修改c2的数据,c1没有任何改变,因为c2是复制了c1 的数据类型,
  11. println("${c1.data}, ${c2.data}")
  12. let s1 = Share()
  13. let s2 = s1
  14. s2.data = 2023 // 改变s2,就改变了s1的数据,因为 s2 没有重新复制s1,而是把s1的数据/空间指向了s2;
  15. println("${s1.data}, ${s2.data}")
  16. }
  17. 输出结果
  18. 2012, 2023
  19. 2023, 2023

图1

1 回复

在HarmonyOS(鸿蒙)或任何现代编程语言中,理解值类型变量与引用类型变量的赋值差异对于编写高效、可维护的代码至关重要。

值类型变量(如int、float、struct等)在赋值时,会复制变量的完整内容到新的变量中。这意味着两个变量在内存中存储的是不同的数据副本,对其中一个变量的修改不会影响到另一个。

引用类型变量(如class、interface等)在赋值时,复制的是变量的引用(即内存地址),而非对象本身。因此,两个引用类型变量可能指向同一个对象实例。对通过任一变量对对象所做的修改都会反映到所有指向该对象的变量上。

在HarmonyOS开发中,这种区分尤其重要,因为它直接影响到内存管理、性能优化以及多线程环境下的数据一致性。开发者需要明确变量类型,以决定如何安全、有效地传递和使用数据。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html (注意:此链接为示例,实际应替换为HarmonyOS或相关技术支持的官方网站)。

回到顶部