kotlin类与对象

kotlin类与对象
康弟弟1. 函数
1.1 创建函数
Kotlin函数使用fun关键字声明:
1 | fun 函数名称([函数参数...]): 返回值类型 { |
例如,我们创造一个空类型的返回函数,在java中我们通常使用void函数,在kotlin中我们使用Unit类型:
1 | //这个函数用于打印一段文本 |
当我们需要一个传入参数的函数的时候,例如:
1 | fun main(){ |
同样我们也可以创建一个字符串常量(变量)将它的传入函数也是一样的:
1 | fun main(){ |
这里的结果和上述一样,这里不再提供图片。特别,当我们需要将函数值返回时,可以将函数体后面的Unit改成需要返回的数值类型,下面以整型加法函数举例:
1 | fun main(){ |
特别的,如果我们在上述函数中想要不传入参数而得到结果,我们在java中常用的方法就是在对应的方法中再写一个重载的相同函数,但是在kotlin中我们可以直接指定他的默认值:
1 | fun main(){ |
这里需要注意,函数中定义好的number1,number2类型是常量,不允许在函数体中进行修改,kotlin中还允许函数中定义函数,这种在java等等语言中是不被允许的:
1 | fun outer(){ |
同时内部函数可以访问外部函数中定义的常量值,但是外部函数不能访问内部函数的值:
1 | fun outer(){ |
1.2 全局变量
在java中,我们通常在一个类中所有的方法前定义一个全局变量,在kotlin中,我们可以设置一个全局变量同时修改它的值和获取方式,这是在java等其他语言中所不被允许的操作:
1 | var str: String = "尊嘟假嘟" |
在这个案例中,在main方法中对str直接打印和赋值时,会自动调用get和set方法:
1.3 递归函数
我们前面学习了如何调用函数,实际上函数自己也可以调用自己。
1 | fun test(){ |
下面通过一个经典的斐波那契数列来分析这个问题,对于求解斐波那契数列第N个数这类问题,我们也可以使用递归来实现:
1 | fun main() { |
不过,这种函数的效率就非常低了,相比循环来说,使用递归解决斐波那契问题,时间复杂度会呈指数倍增长,且n大于20时基本可以说很卡了(可以想象一下,每一个fib(n)都会分两个出去,实际上这个中间存在大量重复的计算)
那么,有没有办法可以将这种尾部作为返回值进行递归的操作优化一下呢?我们可以使用tailrec关键字来实现:
1 | tailrec fun test(n: Int, sum: Int = 0): Int { |
实际上在编译之后,会变成这样:
运行结果:
1.4 库函数
和各大语言一样,kotlin也提供了相比较java更加丰富的库函数:
例如在math库中有着更加丰富的功能:
1 | import kotlin.math.* //我们需要使用import来引入某些库,这样才能使用库函数 |














