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流 ...
随机推荐
- Vue.js项目模板搭建
前言 从今年(2017年)年初起,我们团队开始引入「Vue.js」开发移动端的产品.作为团队的领头人,我的首要任务就是设计 整体的架构 .一个良好的架构必定是具备丰富的开发经验后才能搭建出来的.虽然我 ...
- Axios源码阅读笔记#1 默认配置项
Promise based HTTP client for the browser and node.js 这是 Axios 的定义,Axios 是基于 Promise,用于HTTP客户端--浏览器和 ...
- iOS开发者的管理工具-CocoaPods安装
1. 安装 Ruby 对于iOS开发者,CocoaPods是最方便使用的第三方管理工具了,但是怎么安装CocoaPods呢,安装CocoaPods之前,要确保mac已经安装上Ruby,但在安装Ruby ...
- js函数基础知识
[函数的声明及调用] function 函数名(参数1,参数2,....){ //函数体代码 return返回值: } 1.函数的调用: ①直接调用:函数名(参数1的值,参数2的值,....) ②事件 ...
- Eddy's爱好 hdu2204
Eddy's爱好 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 经典算法研究系列:二、Dijkstra 算法初探
July 二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...
- ASP.Net MVC 布局页 模板页 使用方法详细说明
一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...
- javascript(js)创建对象的模式与继承的几种方式
1.js创建对象的几种方式 工厂模式 为什么会产生工厂模式,原因是使用同一个接口创建很多对象,会产生大量的重复代码,为了解决这个问题,产生了工厂模式. function createPerson(na ...
- webpack2使用ch2-entry和output简要说明
1 entry打包入口 打包字符串和数组 const webpack = require('webpack'), path = require('path'); module.exports = { ...
- Java面向对象 String 基本数据类型对象包装类
Java面向对象 String 知识概要: (1)String的用法详解 (2)基本数据类型对象包装类 String 顾名思义,该类主要是对字符串 ...