Kotlin教程笔记(2) - 类与构造器

简介: Kotlin教程笔记(2) - 类与构造器

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

Kotlin教程笔记(2) - 类与构造器

imgKotlin - 类与构造器

类是什么?

类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物。写法:

class <类名> {
<成员>
}
Number(Int、Float、Byte)、字符串(String)也是类

class Girl constructor(var nature: String,var appearance: String,var sound: String){
// 构造方法的方法体
init {
println("女孩的性格:$nature,长相:$appearance,声音:$sound")
}
}
constructor 是构造器关键字,如果只有一个构造器,则该关键字可以省略。
init 是构造方法的方法体,当用该类创建出一个对象时就会执行。
fun main(args: Array) {
val girl: Girl = Girl("温柔", "甜美", "动人") // 女孩的性格:温柔,长相:甜美,声音:动人
}

类构造器

构造器分为两种,分别是:

主构造器:紧接在类名后面的构造器,参数可以使用 var 声明,init 是主构造器的方法体。
次构造器:在类代码块中声明的构造器,参数不可以使用 var 声明,与 init 无直接关系。
class Girl constructor(var nature: String, var appearance: String, var sound: String) {

// 主构造器的方法体
init {
    println("女孩的性格:$nature,长相:$appearance,声音:$sound")
}

// 次级构造器,无法使用 var 声明变量
constructor(nature: String, appearance: String) : this(nature, appearance, sound = "未知") {
    println("次级构造器")
}

}

fun main(args: Array) {
val girl: Girl = Girl("温柔", "甜美")
// 输出2句:
// 女孩的性格:温柔,长相:甜美,声音:未知
// 次级构造器被调用
}
上面说到,次级构造器与 init 无直接关系,但次级构造器会通过 :this(...) 调用主构造器,从而触发 init 方法体执行。另外,通过输出结果,可以确定 次级构造器方法体 会比 init 方法体晚执行。

个人建议:先写 init,再写次级构造器,看起来会比较舒服。

构造器省略 constructor 关键字

当没有次级构造器,只有一个主构造器时,可以省略 constructor 关键字:

class Girl(var nature: String, var appearance: String, var sound: String) {
...
}

主构造器中的 var 参数

上面说到,主构造器的参数才能使用 var 声明,而次构造器则不行,那么主构造器中有无使用 var 声明的参数,会有何不同?

// 注意:只有nature使用了var声明
class Girl constructor(var nature: String, appearance: String, sound: String) {

init {
    println("女孩的性格:$nature,长相:$appearance,声音:$sound")
}

fun test() {
    println(nature) // 编译OK
    println(appearance) // 编译不通过
    println(sound) // 编译不通过
}

}
init 方法体中可以访问主构造器的所有参数,而方法 test() 却只能访问 var 声明的构造器参数。

主构造器中,使用 var 声明的参数,将成为成员变量,可以在类的各个方法中调用。
而不使用 var 声明参数,只是临时变量,只能在 init 方法体中使用。

类的继承

子类继承父类,可以获得父类的能力,Kotlin 中使用 : 连接子父类,形成继承关系,同时,父类需要使用 open 关键字修饰:

open class Human(nature: String, appearance: String, sound: String) {
init {
println("${this.javaClass.simpleName} 的性格:$nature,长相:$appearance,声音:$sound")
}
}

class Girl(nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
class Boy(nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
从 Java 开发者的角度来讲,Kotlin 中的类默认是 final 类,而使用 open 修饰过的类,会去除 final 关键字。

子类构造器

上述例子中,无论是 Girl 或是 Boy,它们的主构造器参数都没有使用 var 声明,实事上也不能使用 var 声明,我们可以做个实验:

// 报错:'nature' hides member of supertype 'Human' and needs 'override' modifier
class Boy(var nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
Boy 主构造器中使用 var 声明 nature,会报错提示 nature 在父类 Human 中是隐藏成员,你需要使用 override 对其修改,那就按提示把 override 关键字加上,但还会报另一个错:

// 报错:'nature' in 'Human' is final and cannot be overridden
class Boy(override var nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
如果单单对 nature 追加 override 关键字是不够的,因为构造器中的参数默认是 final 修饰过的不可修改变量,需要对父类 Human 主构造器中的 nature 参数再追加 open 关键字来去除这个限制。

open class Human(open var nature: String, var appearance: String, var sound: String) {
...
}
class Boy(override var nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
好了,终于把子类 Boy 的主构造器参数 nature 加上了 var 声明,那这有什么呢?答案是似乎没啥用。

img

因为就算子类 Boy 主构造器参数 nature 不用 var 声明,也一样可以在子类 Boy 的成员方法中使用这个 nature 变量,原因是 nature 早已在父类 Human 的主构造器中使用了 var 声明,它是父类 Human 的成员变量(类似 Java 中的 protected final String nature ),可以被子类 Boy 识别和调用。所以,话说回来,我们什么时候会需要使用 var 来声明与父类构造器参数同名的子类主构造器参数呢?

open class Human(nature: String, var appearance: String, var sound: String) {
...
}

class Boy(var nature: String, appearance: String, sound: String) : Human(nature, appearance, sound)
当父类主构造器参数没有使用 var 声明,而子类又需要在成员方法中使用该参数时,可以在子类的构造器中,为该参数使用 var 追加声明,让其成为子类的成员变量。除此之外,子类主构造器参数的使用与普通的主构造器参数没什么区别。

Any 类

在 Kotlin 中,Any 是所有类的始祖,相当于 Java 中的 Object。

/**

  • The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
    */
    public open class Any {
    ...
    }

    包(Package)

    包就是命名空间
    包的声明必须在非注释代码的第一行
    类的全名是 包名+类名 ,如:com.area.guangzhou.Human
    举个例子,在 com.area.guangzhou 包下声明一个 Human 类:

package com.area.guangzhou // 第一行代码:包声明
/**

  • 广州人
    */
    class Human {
    }
    由于包的存在,因此工程中可以在不同的目录下,声明多个类名相同的类,比如在 com.area.shantou 再声明一个 Human 类:

package com.area.shantou
/**

  • 汕头人
    */
    class Human {
    }
    因为类名相同,所以在同个文件中使用时,为了区分 2 个 Human,需要使用类的全名:

fun main(args: Array) {
val gzHuman = com.area.guangzhou.Human()
val stHuman = com.area.shantou.Human()
}
这样写出来的代码,看起来很不雅观,这时我们可以使用 as 关键字对导包设置别名:

import com.area.guangzhou.Human as 自给人
import com.area.shantou.Human as 胶己人

fun main(args: Array) {
val gzHuman = 自给人()
val stHuman = 胶己人()
}
注意:这里的代码仅为演示说明,实际开发中,为了避免不必要的麻烦,最好不要使用中文进行 coding。

相关文章
|
7天前
|
弹性计算 双11 开发者
阿里云ECS“99套餐”再升级!双11一站式满足全年算力需求
11月1日,阿里云弹性计算ECS双11活动全面开启,在延续火爆的云服务器“99套餐”外,CPU、GPU及容器等算力产品均迎来了全年最低价。同时,阿里云全新推出简捷版控制台ECS Lite及专属宝塔面板,大幅降低企业和开发者使用ECS云服务器门槛。
|
24天前
|
存储 弹性计算 人工智能
阿里云弹性计算_通用计算专场精华概览 | 2024云栖大会回顾
阿里云弹性计算产品线、存储产品线产品负责人Alex Chen(陈起鲲)及团队内多位专家,和中国电子技术标准化研究院云计算标准负责人陈行、北京望石智慧科技有限公司首席架构师王晓满两位嘉宾,一同带来了题为《通用计算新品发布与行业实践》的专场Session。本次专场内容包括阿里云弹性计算全新发布的产品家族、阿里云第 9 代 ECS 企业级实例、CIPU 2.0技术解读、E-HPC+超算融合、倚天云原生算力解析等内容,并发布了国内首个云超算国家标准。
阿里云弹性计算_通用计算专场精华概览 | 2024云栖大会回顾
|
6天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
5天前
|
人工智能 自然语言处理 安全
创新不设限,灵码赋新能:通义灵码新功能深度评测
自从2023年通义灵码发布以来,这款基于阿里云通义大模型的AI编码助手迅速成为开发者心中的“明星产品”。它不仅为个人开发者提供强大支持,还帮助企业团队提升研发效率,推动软件开发行业的创新发展。本文将深入探讨通义灵码最新版本的三大新功能:@workspace、@terminal 和 #team docs,分享这些功能如何在实际工作中提高效率的具体案例。
|
8天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3915 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
11天前
|
负载均衡 算法 网络安全
阿里云WoSign SSL证书申请指南_沃通SSL技术文档
阿里云平台WoSign品牌SSL证书是由阿里云合作伙伴沃通CA提供,上线阿里云平台以来,成为阿里云平台热销的国产品牌证书产品,用户在阿里云平台https://www.aliyun.com/product/cas 可直接下单购买WoSign SSL证书,快捷部署到阿里云产品中。
2185 6
阿里云WoSign SSL证书申请指南_沃通SSL技术文档
|
4天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
837 2
|
1天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
531 4
|
2天前
|
存储 分布式计算 流计算
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
446 7
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
|
23天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服