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流 ...
随机推荐
- MyEclipse中Source Folder,package,folder的区别
1.在eclipse下,package, source folder, folder都是文件夹. 但它们有区别如: 2. package:当你在建立一个package时,它自动建立到source fo ...
- win7旗舰版最新激活密钥
Win7旗舰.企业.专业版的激活密钥(32位.64位均可用).FJGCP-4DFJD-GJY49-VJBQ7-HYRR2 AcerVQ3PY-VRX6D-CBG4J-8C6R2-TCVBD Alien ...
- 51 nod 1495 中国好区间 奇葩卡时间题 700ms 卡O(n*log(n)), 思路:O(n)尺取法
题目: 这个题目竟然叫中国好区间,要不要脸.欸,不得不说还蛮顺口的,哈哈哈. 首先我们有一个数组a.可以递推得来,O(n)时间复杂度. 定义left(有效区间的左端点),bigger(有效区间中大于等 ...
- Linux查找和筛选工具
本文为原创文章,转载请标明出处 目录 文件名通配符 单字符匹配元字符 ? 多字符匹配元字符 * 字符范围匹配符 [] 排除范围匹配符 [!] 命令中的正则表达式 单字符匹配符 . 单字符或字符串重复匹 ...
- Android 实现UI设计
1. 计算屏幕高度,宽度代码(Activity中) DisplayMetrics outMetrics = new DisplayMetrics(); getWindowManager().getDe ...
- Apache ab测试工具使用方法(无参、get传参、post传参)
Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd. ...
- Python数据可视化利器Matplotlib,绘图入门篇,Pyplot介绍
Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在 ...
- Java面向对象 IO (一)
Java面向对象 IO (一) 知识概要: (1)IO概述 (2)IO流的常用基类 (3)IO程序的书写 (4)字符流 写入 读取 文本文件的两种读取方式 ...
- 文件上传之--内存溢出(System.OutOfMemoryException)
两周前就想把这点经验记录下来了,由于拖延症上身,直到刚才突然想起这件未完成的任务,今天是1024,在这个特别的日子里,祝所有程序猿兄弟姐妹们节日快乐! 上传功能一直很正常,直到上传了个500多兆的文件 ...
- 多线程(RunLoop)
1.RunLoop的概念及作用 2.RunLoop的使用 3.RunLoop的相关类 4.RunLoop的工作原理 5.小结 6.思考 什么是RunLoop? 从字面意思上是一直循环跑,事实上就是一个 ...