在任何一门面向对象编程的语言里,类(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. Kotlin——中级篇(五):枚举类(Enum)、接口类(Interface)详解

    在上一章节中,详细的类(class)做了一个实例讲解,提到了类(class)的实例化.构造函数.声明.实现方式.和Java中类的区别等.但是对于Kotlin中的类的使用还远远不止那些.并且在上文中提到 ...

  2. Kotlin——中级篇(二): 属性与字段详解

    在前面的章节中,详细的为大家讲解到了Kotlin中对类的类的定义.使用.初始化.初始化.类继承等内容,但是在一个类中,几乎上是不可能不出现属性与字段(field)的,这一篇文章就为大家奉上Kotlin ...

  3. Kotlin——中级篇(三):可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  4. Kotlin——最详细的抽象类(abstract)、内部类(嵌套类)详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索QQ群号:497071402 进入正题 在前面几个章节中,详 ...

  5. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  6. Java类文件结构详解

    概述: Class文件结构是了解虚拟机的重要基础之一,如果想深入的了解虚拟机,Class文件结构是不能不了解的.Class文件是一组以8位字节为基础单位的二进制流,各项数据项目严格按照顺序紧凑地排列在 ...

  7. Farseer.net轻量级开源框架 入门篇:添加数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...

  8. Farseer.net轻量级开源框架 入门篇:查询数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...

  9. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

随机推荐

  1. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建    參考http://blog.csdn.net/xiaoliouc/article/details/8 ...

  2. 怎样用Google APIs和Google的应用系统进行集成(4)----获得Access Token以通过一些Google APIs的OAuth2认证

    在上篇文章中: "怎样用Google APIs和Google的应用系统进行集成(3)----调用发现Google APIs的RESTful的服务"一文中,我们直接用jdk的java ...

  3. Unity网游开发生存指南—蒸汽之城

    Posted by amy on 2013.03.07 文 / 王楠(梦加网络 游戏制作人) 前段时间关于Unity是否适合国内手游/网游创业团队的讨论非常火爆,本文从<蒸汽之城>的开发历 ...

  4. jquery绑定事件的区别

    query中绑定事件有三种方法:以click事件为例 (1)target.click(function(){}); (2)target.bind("click",function( ...

  5. Java之旅(2)—反射

    1.     概念 反射就是将java类中的各种成分映射成对应的java类.之前我们已经讲过了Class类,也明确了一个java类中用一个Class类的对象来表示,一个类中的组成部分有:成员变量,方法 ...

  6. java之this关键字

    this使用范围 1.在类的方法定义中使用的this关键字代表调用该方法对象的引用. 2.当必须指出当前使用方法的对象是谁时,要使用关键字this. 3.有时使用this可以处理方法中成员变量和参数重 ...

  7. python--web项目

    zope:一个容器项目Plone:一个基于zope的工作流和内容管理项目trac:一个项目管理(任务指派.bug追踪项目,可以和subversion集成)moinmoin:一个强力的weiki系统

  8. node.js 学习03

    node.js学习03 解决浏览器接收服务端信息之后乱码的问题: 服务器通过设置http响应报文头,告诉浏览器使用相应的编码 来解析网页. res.setHeader('Content','text/ ...

  9. (016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)

    给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; Tr ...

  10. atitit.RandomAccessFile rws rwd 的区别于联系

    atitit.RandomAccessFile rws rwd 的区别于联系 1. Rw rws  rwd1 2. "rws" 模式1 3. rwd"模式2 1. Rw  ...