Kotlin:类(class)概述

5,713 阅读4分钟

长相思兮长相忆,短相思兮无穷极
早知如此绊人心,何如当初莫相识

                        ——李白 ·《秋风词》

在任何一门面向对象编程的语言里,类(class)是非常基础、但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类。Kotlin也是如此,下面详细为大家介绍Kotlin中的类的组成结构、函数、声明等。

目录

一、类的声明

1.1、关键字

声明类的关键字为class

1.2、声明格式

class Test{
// 属性...
 ...
// 构造函数
 ...
// 函数
 ...
// 内部类
 ...
 ...
}

其中:当类没有结构体的时候,大括号可以省略。即:

class Test

二、类的构造函数

  • Kotlin中,允许有一个主构造函数和多个二级构造函数(辅助构造函数)。其中主构造函数是类头的一部分。
  • 关键字或者构造函数名:constructor(参数)

2.1、主构造函数

  • 主构造函数是类头的一部分,类名的后面跟上构造函数的关键字以及类型参数。

2.1.1、举例说明:

class Test constructor(num : Int){
    ...
}

等价于

/*
   因为是默认的可见性修饰符且不存在任何的注释符
   故而主构造函数constructor关键字可以省略
*/

class Test(num: Int){
    ...
}

2.1.2、构造函数中的初始化代码块

  • 构造函数中不能出现其他的代码,只能包含初始化代码。包含在初始化代码块中。
  • 关键字:init{…}
  • 值得注意的是,init{…}中能使用构造函数中的参数

例:

fun main(args: Array<String>) {
    // 类的实例化,会在下面讲解到,这里只是作为例子讲解打印结果
    var test = Test(1)
}

class Test constructor(var num : Int){
    init {
        num = 5
        println("num = $num")
    }
}

输出结果为:

num = 5

2.1.3、声明属性的简便方法

  • 即在主构造函数中声明。

例:

class Test(val num1 : Intvar num2 : Longval str : String){
    ...
}

相当于声明了3个属性。其中,var表示变量(可读写),val表示常量(只读)。

2.1.4、什么时候constructor可以省略

  • 在构造函数不具有注解符或者默认的可见性修饰符时,constructor关键字可以省略。
  • 默认的可见性修饰符时public。可以省略不写。

例:

// 类似下面两种情况的,都必须存在constructor关键字,并且在修饰符或者注释符后面。
class Test private constructor(num: Int){}

class Test @Inject constructor(num: Int){}

2.2、辅助(二级)构造函数

  • Kotlin中支持二级构造函数。它们以constructor关键字作为前缀。

2.2.1、声明

例:

class Test{
    constructor(参数列表){

    }
}

2.2.2、同时存在主构造函数和二级构造函数时的情况

  • 如果类具有主构造函数,则每个辅助构造函数需要通过另一个辅助构造函数直接或间接地委派给主构造函数。 使用this关键字对同一类的另一个构造函数进行委派:

例:

fun main(args: Array<String>) {
    var test1 = Test(1)
    var test2 = Test(1,2)
}

// 这里是为了代码清晰,故而没有隐藏constructor关键字
class Test constructor(num: Int){

    init {
        println("num = $num")
    }

    constructor(num : Int, num2: Int) : this(num) {
        println(num + num2)
    }
}

说明:二级构造函数中的参数1(num),是委托了主构造函数的参数num

可以看出,当实例化类的时候只传1个参数的时候,只会执行init代码块中的代码。当传2个参数的时候,除了执行了init代码块中代码外,还执行了二级构造函数中的代码。

输出结果为:

num = 1
num = 1
3

2.2.3、当类的主构造函数都存在默认值时的情况

  • JVM上,如果类主构造函数的所有参数都具有默认值,编译器将生成一个额外的无参数构造函数,它将使用默认值。 这使得更容易使用Kotlin与诸如JacksonJPA的库,通过无参数构造函数创建类实例。
  • 同理可看出,当类存在主构造函数并且有默认值时,二级构造函数也适用

例:

fun main(args: Array<String>) {
    var test = Test()
    var test1 = Test(1,2)
    var test2 = Test(4,5,6)
}

class Test constructor(num1: Int = 10 , num2: Int = 20){

    init {
        println("num1 = $num1\t num2 = $num2")
    }

    constructor(num1 : Int = 1, num2 : Int = 2, num3 : Int = 3) : this(num1 , num2){
        println("num1 = $num1\t num2 = $num2 \t num3 = $num3")
    }
}

输出结果为:

num1 = 10     num2 = 20
num1 = 1     num2 = 2
num1 = 4     num2 = 5
num1 = 4     num2 = 5    num3 = 6

说明: 当实例化无参的构造函数时。使用了参数的默认值。

三、类的实例化

  • 创建一个类的实例,需要调用类的构造函数,就像它是一个常规函数一样:

例:

var test = Test()
var test1 = Test(1,2)

PS:这里和Java不同的点是,没有new这个关键字

四、类的组成

类的构成有以下5部分:

  • 构造函数和初始化代码块
  • 属性(字段)
  • 函数(方法)
  • 内部类(嵌套类)
  • 对象声明

五、类的类别

Kotlin中的类可详细的分为:

  • 密封类
  • 内部类(嵌套类)
  • 抽象类
  • 枚举类
  • 接口类
  • 数据类

此篇文章大多数都是理论性东西,关于4,5两点中出现的知识,这里由于篇幅原因故而不多做解释,请继续查看后续的文章,会一一讲解。

本文已收录至GitHub: Jetictors/KotlinLearn,欢迎star

文章持续更新中,可以微信搜索「J佬杂谈 」第一时间阅读, 大家的三连击是对老J最好的动力了,你确定不来一波吗?

如果本篇博客有任何错误和建议,欢迎人才们留言


啊喂,五指菇娘啊,拿着手机扫描一下吧!