在任何一门面向对象编程的语言里,类(class
)是很是基础、但也是很是重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是咱们生成的类。Kotlin
也是如此,下面详细为你们介绍Kotlin
中的类的组成结构、函数、声明等。html
一、关键字git
声明类的关键字为
class
github
二、声明格式编程
class Test{ // 属性... ... // 构造函数 ... // 函数 ... // 内部类 ... ... }
其中:函数
当类没有结构体的时候,大括号能够省略。即:this
class Test
- 在
Kotlin
中,容许有一个主构造函数和多个二级构造函数(辅助构造函数)。其中主构造函数是类头的一部分。- 关键字或者构造函数名:
constructor(参数)
一、主构造函数3d
- 主构造函数是类头的一部分,类名的后面跟上构造函数的关键字以及类型参数。
1.一、举例说明:code
class Test constructor(num : Int){ ... }
等价于htm
/* 由于是默认的可见性修饰符且不存在任何的注释符 故而主构造函数constructor关键字能够省略 */ class Test(num: Int){ ... }
1.二、构造函数中的初始化代码块对象
- 构造函数中不能出现其余的代码,只能包含初始化代码。包含在初始化代码块中。
- 关键字:
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
其中,上面的constructor
关键字是能够省略的。
1.三、声明属性的简便方法
- 即在主构造函数中声明。
例:
class Test(val num1 : Int, var num2 : Long, val str : String){ ... }
则:至关于声明了3个属性。
其中,var
表示变量(可读写),val
表示常量(只读)。
1.四、何时constructor能够省略
- 在构造函数不具备注释符或者默认的可见性修饰符时,
constructor
关键字能够省略。- 默认的可见性修饰符时
public
。能够省略不写。请阅读个人另外一篇文章Kotlin——中级篇(三):可见性修饰符详解
例:
// 相似下面两种状况的,都必须存在constructor关键字,而且在修饰符或者注释符后面。 class Test private constructor(num: Int){ } class Test @Inject constructor(num: Int){ }
二、辅助(二级)构造函数
Kotlin
中支持二级构造函数。它们以constructor
关键字做为前缀。
2.一、声明
例:
class Test{ constructor(参数列表){ } }
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.三、当类的主构造函数都存在默认值时的状况
- 在
JVM
上,若是类主构造函数的全部参数都具备默认值,编译器将生成一个额外的无参数构造函数,它将使用默认值。 这使得更容易使用Kotlin
与诸如Jackson
或JPA
的库,经过无参数构造函数建立类实例。- 同理可看出,当类存在主构造函数而且有默认值时,二级构造函数也适用
例:
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)
其实在上面的例子中就实例化类的运用。
注意:这里和Java
不一样的点是,没有new
这个关键字
- 类的构成由
构造函数和初始化代码块、属性(字段)、函数(方法)、内部类(嵌套类)、对象声明
五部分组成
一、构造函数和初始化代码块
在此篇文章已经讲解,不清楚请再次熟悉下此篇文章中的构造函数模块。
二、属性(字段)
因为篇幅缘由,请参见Kotlin——中级篇(二): 属性与字段详解章节。
三、函数(方法)
因为篇幅缘由,请参见Kotlin——初级篇(七):函数基础总结章节。
四、内部类(嵌套类)
因为篇幅缘由,请参见Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解章节。
五、对象声明
因为篇幅缘由,请参见对象声明章节。
Kotlin
中的类可详细的分为:密封类、内部类(嵌套类)、抽象类、枚举类、接口类、数据类
一、密封类
因为篇幅缘由,请参见Kotlin——中级篇(六):数据类(data)、密封类(sealed)详解章节。
二、内部类(嵌套类)
内部类
、嵌套类
已在Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解中讲解过了。
三、抽象类
因为篇幅缘由,请参见Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解章节。
四、枚举类
因为篇幅缘由,请参见Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解章节。
五、接口类
因为篇幅缘由,请参见Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解章节。
六、数据类
因为篇幅缘由,请参见Kotlin——中级篇(六):数据类(data)、密封类(sealed)详解章节。
因为篇幅缘由,请参见Kotlin——中级篇(四):继承类详解章节。
关于类的介绍就到这里,不清楚的能够多看看文章。不过也没太大关系,此篇文章大多数都是理论性东西。本身用Kotlin
多写写代码就理解、掌握了。
若是各位大佬看了以后感受还阔以,就请各位大佬随便star
一下,您的关注是我最大的动力。
个人我的博客:Jetictors
个人掘金:Jetictors
Github:Jetictors