Kotlin——最详解的类(class)的使用

在任何一门面向对象编程的语言里,类(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关键字可以省略。- 默认的可见性修饰符时
public。可以省略不写。请阅读我的另一篇文章Kotlin——中级篇(三):可见性修饰符详解
例:
// 类似下面两种情况的,都必须存在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与诸如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这个关键字
四、类的组成
- 类的构成由
构造函数和初始化代码块、属性(字段)、函数(方法)、内部类(嵌套类)、对象声明五部分组成
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
Github:Jetictors
欢迎各位大佬进群共同研究、探索
QQ群号:497071402
Kotlin——最详解的类(class)的使用的更多相关文章
- unity3D游戏开发之详解Animation类和Animator类
详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...
- 【python进阶】详解元类及其应用1
前言 元类在python中是很重要的一部分,我将分两次去讲解元类及其应用,此篇为详解元类及其应用第一篇,下面开始今天的说明~~~ 1. 类也是对象 在⼤多数编程语⾔中,类就是⼀组⽤来描述如何⽣成⼀个对 ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- Unity3D - 详解Quaternion类(二)
OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...
- Unity3D - 详解Quaternion类(一)
一.简介 Quaternion又称四元数,由x,y,z和w这四个分量组成,是由爱尔兰数学家威廉·卢云·哈密顿在1843年发现的数学概念.四元数的乘法不符合交换律.从明确地角度而言,四元数是复数的不可交 ...
- IOC和AOP使用扩展之AOP详解实现类
摘要: “Depend on yourself” is what nature says to every man. Parents can help you. Teachers can hel ...
- 详解 Arrays类
请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ...
- 详解 Collections类
(请关注 本人"集合总集篇"博文--<详解 集合框架>) 有的同学可能会有这样的疑问 -- Collections类也是集合吗? 答曰:非也! 那为什么要讲解这个类呢? ...
- 详解 Paths类 与 Files类
在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...
随机推荐
- JSP页面格式化数字或时间 基于struts的
jsp日期格式化 转自: http://blog.csdn.net/chj225500/article/details/7251552 在直接<s:textfield中也要日期格式化,平时使用日 ...
- Spring配置文件的命名空间URI
Spring配置文件介绍 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=" ...
- 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字
上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...
- PHP 生成毫秒时间戳
PHP的time()函数生成当前时间的秒数,但是在一些情况下我们需要获取当前服务器时间和GMT(格林威治时间)1970年1月0时0分0秒的毫秒数,与Java中的currentTimeMilis()函数 ...
- 支持向量机(Support Vector Machine)-----SVM之SMO算法(转)
此文转自两篇博文 有修改 序列最小优化算法(英语:Sequential minimal optimization, SMO)是一种用于解决支持向量机训练过程中所产生优化问题的算法.SMO由微软研究院的 ...
- Java历程-初学篇 Day08 数组
一,什么是数组 所谓数组,是相同数据类型的元素按一定顺序排列的集合.若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用 ...
- 【转】HTTP Header 详解
HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应.就整个网络资源传 ...
- JAVA提高二:枚举
JDK5.0中有一个非常有用的特性:枚举,这个特性以前在C语言中出现过,后来JDK出现后,开始觉得没有必要,但随着使用JAVA语言的人数增多,发现大家对枚举的需求非常大,于是又加入了此特性,下面我们来 ...
- DevOps之网络
唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <网络(Network)> 关于网络的网络架构和网络模型:知识与技能的层次(知道. ...
- win10 uwp 应用转后台清理内存
我在写小说阅读器,把每个打开的文件的内容读到内存,因为小说都很小,所以放在内存不怕太大,但是我如果打开了一本小说,再打开一本,我不会把先打开的小说的内容清除掉,在内存.所以一旦我打开多小说的时候,内存 ...