华为仓颉语言初识:结构体struct和类class的异同

简介: 华为仓颉语言是一种基于鸿蒙系统的新型编程语言,结合了Java和C的特点,支持与ArkTs互相调用,提升应用性能。本文详细对比了仓颉语言中结构体(struct)和类(class)的区别:struct不支持继承,赋值时为值传递;而class支持单继承、多实现,赋值时为引用传递。两者均支持构造函数及成员访问修饰符,但struct新增internal修饰符限制包内访问。开发者需根据实际需求选择合适的使用场景。

前言

华为仓颉语言是鸿蒙原生应用的一种新的编程语言,采用面向对象的编程思想,为开发者带来新的开发体验。不仅可以和 ArkTs 相互调用,更能提升应用程序的性能,更重要的是仓颉语言的特点结合了 java 和 C 的特点。对开发者来说比较容易上手学习,本篇文章主要是详细介绍仓颉语言中的结构体 struct 和类 class 的区别,建议点赞收藏!

结构体 Struct

  1. 仓颉中的结构体以 strcut 作为开头,后面跟着结构体的名称,并以花括号作为主体部分,struct 中可以定义一系列成员变量,成员属性,构造函数等。
struct Person {
  let name :String
  let age:Int64
  pubilc init(name:String,age:Int64){
    this.name = name
    this.age = age
  }
  public func speak(){
    println("Hello World")
  }
}
  1. 从代码结构上来看,struct 整体结构与 java 中的类差不多,init 表示的函数为普通构造函数,除此之外 struct 还支持主构造函数。可以直接将成员属性定义在主构造函数中。
struct Person {
  pubilc Person(let name:String,let age:Int64){}
  public func speak(){
    println("Hello World")
  }
}
  1. 主构造函数的函数名称和 struct 名称一样。同时可以在主构造函数的参数列表中定义 struct 的成员变量。
  2. struct 的成员访问修饰符除了常见的 public,protected,private 之外,还新增了一个 internal 修饰符,表示仅当前包季子包可以访问。这就意味着使用导包的方式引用有 internal 修饰的成员变量,无法访问该变量。

类 class

  1. 仓颉中的类和 Java 中的类差不多,学习起来比较简单,都是以 class 关键字定义的。
class Person {
  let name :String
  let age:Int64
  pubilc init(name:String,age:Int64){
    this.name = name
    this.age = age
  }
  public func speak(){
    println("Hello World")
  }
}
  1. class 类支持单继承,多实现的特点,使用 open 修饰的类才可以被继承。同时也支持使用abstract 修饰为抽象类,继承使用<:符号表示。
public open class Person {
  let name :String
  let age:Int64
  pubilc init(name:String,age:Int64){
    this.name = name
    this.age = age
  }
  public func speak(){
    println("Hello World")
  }
}
class Student <:Person{
  
}
  1. class 类支持普通构造函数的重载,有且只有一个静态初始化器,这点和 struct 完全相同。
  2. class 类同样支持重写父类的方法。
public open class Person {
  let name :String
  let age:Int64
  pubilc init(name:String,age:Int64){
    this.name = name
    this.age = age
  }
  public func speak(){
    println("Hello World")
  }
}
class Student <:Person{
  public override func speak(){
    println("Hello 仓颉")
  }
  
}
  1. class 类支持主构造函数。
  2. 抽象类还可以被 sealed 修饰,表示被修饰的类定义只能在本定义所在的包内被其他类继承。

不同点

  • 结构体 struct 不支持继承,也不能被定义为抽象,而 class 类可以。
  • 结构体的实例对象在赋值给另一个对象时,表示值传递而并不是像 class 类的引用传递。

总结

仓颉中的结构体struct和 class 类有很多相同之处,开发者需要注意使用场景以及两者之间的异同之处。特别需要注意结构体 struct 的实例赋值给另一个实例对象后,相当于实例对象的拷贝,两者之间的内存地址并不相同,不同的操作两者之间并不会互相影响,而 class 类和 java 中的类一样,都是表示引用传递,拥有相同的内存地址。

目录
相关文章
|
小程序
微信小程序四种弹窗方式实例
微信小程序四种弹窗方式实例
1648 0
微信小程序四种弹窗方式实例
|
12月前
|
存储 监控 Cloud Native
云原生日志监控体系怎么做才不崩?一篇给你讲透采集、存储、分析、告警的最佳实践
云原生日志监控体系怎么做才不崩?一篇给你讲透采集、存储、分析、告警的最佳实践
828 16
|
安全 API 开发者
鸿蒙NEXT-鸿蒙老版本迁移最新版本(API19,modelVersion5.1.1)
鸿蒙更新至API19,新增热更新支持、资源过滤、内存分析等功能。本文详解手动迁移步骤及上下文获取问题解决方案。
639 0
|
存储 JSON 开发框架
给开源大模型带来Function Calling、 Respond With Class
OpenAI 在他的多个版本的模型里提供了一个非常有用的功能叫 Function Calling,就是你传递一些方法的信息给到大模型,大模型根据用户的提问选择合适的方法,然后输出给你,你再来执行。
|
消息中间件 Java Kafka
Golang 语言中 kafka 客户端库 sarama
Golang 语言中 kafka 客户端库 sarama
1033 0
|
缓存 人工智能 自然语言处理
GraphRAG、Naive RAG框架总结主流框架推荐(共23个):LightRAG、nano-GraphRAG、Fast-GraphRAG、Dify、RAGflow等
GraphRAG、Naive RAG框架总结主流框架推荐(共23个):LightRAG、nano-GraphRAG、Fast-GraphRAG、Dify、RAGflow等
|
人工智能 算法 数据可视化
智慧停车场车位引导及反向寻车解决方案
智慧停车场导航系统结合了先进的室内定位技术和导航算法,旨在解决大型公共场所停车难、找车难等问题。系统不仅提供精准的停车引导、反向寻车及停车场内导航服务,还通过大数据分析优化停车场管理和用户体验,是提升现代城市智能化水平的重要组成部分。
2314 19
ly~
|
缓存 监控 编译器
如何优化 SDL 图形库在不同系统中的性能
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体开发库,用于优化不同系统中的图形库性能。在银河麒麟系统中,通过SDL渲染模式提升视频监控客户端性能,支持更多播放路数。优化方法包括:1) 图像加载时使用SDL_ConvertSurface转换图像格式,避免内存中存在多份拷贝;2) 在VSCode下配置SDL时,合理设置编译器选项和项目架构,减少API调用带来的性能开销;3) 使用SDL库在景嘉微7200显卡上优化渲染性能,提高播放路数。综合考虑图像加载优化、系统特性利用及硬件兼容性,以实现最佳性能。
ly~
1201 6
|
缓存 开发者 网络架构
ArkTS 函数方法基础:掌握核心编程概念
本文深入探讨了ArkTS中的函数和方法,涵盖函数声明、参数处理、返回类型、作用域、函数类型等内容,帮助开发者掌握ArkTS的核心编程概念。通过实例讲解可选参数、rest参数、默认参数等特性,并讨论函数在面向对象编程、性能优化和错误处理中的应用,助力开发者编写更健壮、可维护的代码。
1217 0
|
存储 编解码 开发工具
拉取RTSP流后的几个去向探讨(播放|转RTMP|轻量级RTSP服务|本地录制|GB28181)
本文汇总了大牛直播SDK在Android平台上拉取RTSP流后的多种应用方向,包括本地播放、转推至RTMP服务器、轻量级RTSP服务、GB28181平台及录像等功能。提供了详细的实现方法与示例代码,旨在帮助开发者高效利用RTSP流数据,实现低延迟、稳定且灵活的应用场景。
924 1