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

目录

一、类的声明

1、关键字

声明类的关键字为class

2、声明格式

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

其中:

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

class Test

二、类的构造函数

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

1、主构造函数

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

1.1、举例说明:

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

等价于

/*
因为是默认的可见性修饰符且不存在任何的注释符
故而主构造函数constructor关键字可以省略
*/
class Test(num: Int){
...
}

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

其中,上面的constructor关键字是可以省略的。

1.3、声明属性的简便方法

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

例:

class Test(val num1 : Int, var num2 : Long, val str : String){
...
}

则:相当于声明了3个属性。

其中,var表示变量(可读写),val表示常量(只读)。

1.4、什么时候constructor可以省略

例:

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

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

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

2.1、声明

例:

class Test{
constructor(参数列表){ }
}

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.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)

其实在上面的例子中就实例化类的运用。

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

四、类的组成

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

1、构造函数和初始化代码块

在此篇文章已经讲解,不清楚请再次熟悉下此篇文章中的构造函数模块。

2、属性(字段)

由于篇幅原因,请参见Kotlin——中级篇(二): 属性与字段详解章节。

3、函数(方法)

由于篇幅原因,请参见Kotlin——初级篇(七):函数基础总结章节。

4、内部类(嵌套类)

由于篇幅原因,请参见Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解章节。

5、对象声明

由于篇幅原因,请参见对象声明章节。

五、类的类别

  • Kotlin中的类可详细的分为:密封类、内部类(嵌套类)、抽象类、枚举类、接口类、数据类

1、密封类

由于篇幅原因,请参见Kotlin——中级篇(六):数据类(data)、密封类(sealed)详解章节。

2、内部类(嵌套类)

内部类嵌套类已在Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解中讲解过了。

3、抽象类

由于篇幅原因,请参见Kotlin——中级篇(七):抽象类(abstract)、内部类(嵌套类)详解章节。

4、枚举类

由于篇幅原因,请参见Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解章节。

5、接口类

由于篇幅原因,请参见Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解章节。

6、数据类

由于篇幅原因,请参见Kotlin——中级篇(六):数据类(data)、密封类(sealed)详解章节。

六、类的继承

由于篇幅原因,请参见Kotlin——中级篇(四):继承类详解章节。

七、总结

关于类的介绍就到这里,不清楚的可以多看看文章。不过也没太大关系,此篇文章大多数都是理论性东西。自己用Kotlin多写写代码就理解、掌握了。

项目源代码

如果各位大佬看了之后感觉还阔以,就请各位大佬随便star一下,您的关注是我最大的动力。

我的个人博客Jetictors

我的掘金Jetictors

GithubJetictors

欢迎各位大佬进群共同研究、探索

QQ群号:497071402

Kotlin——最详解的类(class)的使用的更多相关文章

  1. unity3D游戏开发之详解Animation类和Animator类

    详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...

  2. 【python进阶】详解元类及其应用1

    前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ...

  3. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

  4. Unity3D - 详解Quaternion类(二)

    OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...

  5. Unity3D - 详解Quaternion类(一)

    一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...

  6. IOC和AOP使用扩展之AOP详解实现类

    摘要:   “Depend on yourself” is what nature says to every man.  Parents can help you. Teachers can hel ...

  7. 详解 Arrays类

    请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ...

  8. 详解 Collections类

    (请关注 本人"集合总集篇"博文--<详解 集合框架>) 有的同学可能会有这样的疑问 -- Collections类也是集合吗? 答曰:非也! 那为什么要讲解这个类呢? ...

  9. 详解 Paths类 与 Files类

    在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...

随机推荐

  1. weblogic-部署web应用

    1, weblogic 安装介质的获取: oracle 官方weblogic下载 :   http://www.oracle.com/technetwork/middleware/weblogic/d ...

  2. mongodb 在windows下面进行分片

    在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存就吃不消了,针对这样的场景我们该如何应对. 一:分片 mongo ...

  3. oracle安装时,条件检查不通过解决办法

    1.开始菜单→ 运行:输入regedit,打开注册表 2.依次点开HKEY_LOCAL_MACHINE>>SYSTEM>>CurrenControlSet>>ser ...

  4. Dynamic web module 版本之间的区别

    Servlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传Servlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释Servlet ...

  5. 在web中使用HTTPS

    背景 目前网上流行的是HTTP协议,HTTPS协议还在逐步推广的过程中. HTTP协议以明文发送内容,容易被攻击者窃听.HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份[ ...

  6. IIC-BUS INTERFACE

    I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. To control multi-master IIC-bus opera ...

  7. Quartz源码——QuartzSchedulerThread.run() 源码分析(三)

    QuartzSchedulerThread.run()是主要处理任务的方法!下面进行分析,方便自己查看! 我都是分析的jobStore 方式为jdbc的SimpleTrigger!RAM的方式类似分析 ...

  8. Finding LCM (最小公倍数)

    Finding LCM Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu [Submit]   ...

  9. python-实现一个贴吧图片爬虫

    今天没事回家写了个贴吧图片下载程序,工具用的是PyCharm,这个工具很实用,开始用的Eclipse,但是再使用类库或者其它方便并不实用,所以最后下了个专业开发python程序的工具,开发环境是Pyt ...

  10. 电脑IP地址被占用如何释放?

    回车后,关机,等待5分钟左右再开机,就释放掉了.