前言

仓颉语言学习初步


一、语言特性

多范式语言:在多范式语言中,程序员可以根据特定的问题需求选择合适的编程范式来编写代码,从而提高代码的可读性和可维护性。多范式语言可以更灵活地应对不同类型的问题,同时也能够结合各种编程范式的优点。

二、语言内容

1.编码规范

标识符的具体的细节,就是给类、变量、函数、宏,自定义数据类型命名的规范。
类名、变量名、函数名、自定义数据类型首字母是可以字母或下划线(数字不可以
后面可以是任意长度的字母或下划线、数字

两个单词之间,第二个单词首字母大写,小驼峰命名法

2.定义变量

man():Int64{
var a1: Int16 = 10
printIn(a1)
return(0)
}

同时变量也存在全局变量和局部变量

2.1静态变量与非静态变量

// 仓颉可以有类
public class Student {
    // 实例变量,也叫做非静态变量,属于具体哪个实例对象
    public var stuAge: Int16 = 22
    
    // 静态变量,还有一个名称,叫做类变量,是属于类的而不是函数的
    public static var schoolAge: Int16 = 40
}

  • 实例变量定义:也称为非静态变量,属于具体对象实例的属性
  • 类变量定义:也称为静态变量,使用static修饰,属于整个类的属性
  • 关键区别:
    • 实例变量属于各个对象实例(如学生个人的年龄)
    • 类变量属于类本身,被所有实例共享(如学校成立年限)

2.2访问区别

静态变量(类变量)访问时,可直接通过类进行访问

非静态变量必须通过实例化才可访问

2.3常量命名

常量不允许改变其值,大写命名(大驼峰命名法)

const VALUE : Int32 = 100

与let进行对比

//定义一个常量,常量定义时一定要赋值,其值不能改变
const MAX_VALUE: Int64 = 100

//使用let关键字定义变量,这个变量叫做 不可变变量,定义时可以不赋值
let value1: Int64

value1 = 10 //只能赋值一次

println(value1)//输出,可读

//value = 20 不可以写//

与var进行对比

//使用var关键字定义变量,这个变量叫做 可变变量
//可读可写
var value2: Int64
value2 = 50
println(value2)
value2 = 60

3.仓颉的数据类型

3.1基本数据类型

整数类型:二进制ob或oB 八进制0o或0O 十六进制0x或0X

  通常运算时使用Int64,避免运算时不必要的类型转换

浮点类型:默认输出是6位有效数字

布尔类型:true和false

字符类型:用‘ ’

字符串类型:用“ ”,字符串类型可以和字符串类型和字符类型拼接

元组类型:初始化赋值后,不可以再修改,元组必须是二元的

区间类型:区间类型的值都是统一的数据类型,参照<>,start..end:step   开始..结束:步长

unit类型:()

Nothing类型:break continue return throw

3.2引用类型,类,接口,枚举类型

引用类型class interface enum

引用类型进行赋值时是将地址进行赋值

var emp1 :Emp = Emp()
//引用类型 class , interface, enum

//emp1地址赋值给了emp2,emp2和emp1的指向的地址是同一块
var emp2 = emp1
emp1.a1 = 200

println("${emp1.a1}, 和 ${emp2.a1}")

return 0

与之不同的是值类型的赋值,是将数据进行拷贝,生成一个副本

var a1 :Int64 = 10

var b1 = a1  // 值类型的赋值操作  

a1++        // 后置自增  

println("a1的值为: ${a1}, b1的值为: ${b1}")  

b1 += 10  
println("a1的值为: ${a1}, b1的值为: ${b1}")  

赋值部分与JAVA进行对比

java的字符串可以赋值

直接赋值(使用的是字符串池):如果池中已存在相同字符串,则直接复用,不会创建新对象,节省内存

val str1 = "hello"  // 使用字符串池
val str2 = "hello"  // 复用池中的 "hello",str1 和 str2 指向同一对象
println(str1 === str2) // true(引用相同)

new关键字创建:哪怕字符串内容相同,不会重复使用字符串池,而是生成独立对象

val str3 = String("hello".toCharArray())  // 堆内存新建对象
val str4 = String("hello".toCharArray())  // 另一个新对象
println(str3 === str4) // false(不同引用)
仓颉与JAVA在赋值上的一些差异

3.3自定义类型struc类型

struct关键字定义

与class的区别,struct不支持继承

整数类型,浮点类型都是单个值,struct是个值类型(赋值时是内容副本进行拷贝),可以设计的自定义类型

成员变量mut函数

// 创建自定义类型 struct关键字
public struct Values {
    // 有成员变量
    var a1: Int64

    static var a2 : Int64 = 0

    // 构造函数,分为主构造函数、普通构造函数
    // 作用:初始化struct自定义类型的属性的值
    
    // 1. 普通构造函数(可以有多个,必须有不同的参数列表,实际就是构造函数重载)
    // 不能有关键字 func
    // 重载的概念:同一个方法名,不同的参数列表
    // 多个构造函数的构建是为了创建自定义类型struct的不同对象的多种入口

    // this(10,20)普通构造函数可以使用this(参数列表)调用其他构造函数
    public init(al: Int64) {
        self.al = al
    }
    
    public init(al: Int64, a2: Int64) {
        self.al = al
    }

// 2. 主构造函数,要求主构造函数的名字和struct定义的名字一致
// 并只能有一个主构造函数,主构造函数参数唯一

//this(20,30)主构造函数不可以使用this(参数列表)调用其他构造函数
public Values(a1: Int64, a2: String) {
    this.a1 = 100
}

// 静态构造函数,初始化静态变量,在仓颉中不能够在静态构造函数中使用实例变量

//静态构造函数无参数
static init() {
    // this.a1 = 200  // this表示当前对象,在static构建的函数中,都不能使用this关键字
    // a1 = 300       // 错误:无法访问实例变量a1
    a2 = 300          // 正确:a2应为静态变量
}

静态构造函数最先被加载

public struct One {
    public var a1: Float64 = 20.0          // 实例变量
    public static var a2: Int64 = 0        // 静态变量

    // 静态构造函数(无参数,最先加载)
    static init() {
        // 静态构造函数中只能使用静态变量
        // a1 = 100.0  // 错误:不能访问实例变量a1
        a2 = 50
        println("现在的静态的构造函数中a2的值为:${a2}")
    }
}

在仓颉中静态成员(变量/函数)通过类型名直接访问,无需实例化

对于构造函数来说,没有提供参数的自定义数据类型可运行无需参数的构造函数

而如果自定义数据类型中没有提供对应的参数列表的构造函数,那么创建对象是错误的。

// 创建自定义数据类型One的对象
// 创建对象,一定依赖于类中提供的构造函数(可以是主构造或普通构造函数)
// 隐式的调用,隐式的一定依赖于类中提供的构造函数(可以是主构造或普通构造函数)
// var one : One =One(200.09)
var one1 :One = One()

// 如果自定义数据类型中没有提供对应的参数列表的构造函数,那么创建对象是错误的。
var one2 :One = One(10,20)

struct类型的实例成员函数不能修改实例成员变量的值,如果在struct类型的实例成员函数修改实例成员变量的值,必须使用关键字mut(mut函数不能修饰静态函数)

并且不可变变量如果初始时没有赋值,再想赋值时必须在构造函数中进行

public struct One1 {
    // struct类型的实例成员函数不能修改实例成员变量的值
    public let a1: Int64
    
    public var a2: Int64 = 0
    
    public One1() {
        self.a1 = 100
    }
    
    // struct类型的实例成员函数不能修改实例成员变量的值
    // 如果在struct类型的实例成员函数修改实例成员变量的值,必须给这个函数关键字mut
    // mut函数
    public mut func changeValue() {
        self.a2 = 100
    }
}

同时调用mut函数时,仓颉定义的自定义数据类型的对象必须用var声明

var one1: One=One1()


总结:初步学习了仓颉语言的变量基本类型和函数等,着重学习结构体(struct)在仓颉鸿蒙中是一个特殊的值类型,包含多个属性。其生命周期包括静态构造函数、主构造函数和普通构造函数。成员变量分为可变和不可变,不可变变量在成员函数中不能直接修改,需通过定义mart函数进行修改。调用mart函数时,对象类型必须为struct类型。理解struct的生命周期和属性修改规则对掌握鸿蒙编程基础至关重要。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐