第一篇博客
前言
仓颉语言学习初步
一、语言特性
多范式语言:在多范式语言中,程序员可以根据特定的问题需求选择合适的编程范式来编写代码,从而提高代码的可读性和可维护性。多范式语言可以更灵活地应对不同类型的问题,同时也能够结合各种编程范式的优点。
二、语言内容
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: Int64value1 = 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 = 200println("${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: Int64static 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的生命周期和属性修改规则对掌握鸿蒙编程基础至关重要。
更多推荐


所有评论(0)