目录
一、方法重载与默认参数
Kotlin中的方法重载基本和Java一样,有一点不同的是默认参数的使用。在Java中,如果你想在类中创建一个方法,方法接受一个Int类型的参数,如果不填写参数,默认为-1,你会怎么办?肯定会创建两个方法,一个有参数的,一个没有参数的。但是在Kotlin中只需要一个方法就可以了,使用默认参数的方式,如下代码:
fun main(args: Array<String>) {
val testClass = TestClass()
testClass.testFun()
testClass.testFun(5)
}
class TestClass{
fun testFun(value:Int=0){
println("重载方法的参数:$value")
}
}
输出如下:
重载方法的参数:0
重载方法的参数:5
以上就是默认参数的使用
二、扩展成员
什么是Kotlin中的扩展呢?假如在Java中,我们想给String这个类定义一个新的方法,这个方法添加我们想要的处理逻辑,应该怎么办?我想大家想到的应该是继承,创建一个新的类,继承String,然后写上这个方法。其实在Kotlin中完全不用这样,一个方法就可以解决以上需求,看如下代码:
fun main(args: Array<String>) {
"this is first String".println()
"this is second String".print()
}
fun String.print(){
print(this)
}
fun String.println(){
println(this)
}
方法print和println都是我们自定义的方法,而前面的String就是被拓展的类,this表示的就是字符串本身,最后输出的就是打印逻辑。是不是非常神奇,和非常便捷呢。我们还可以这样写:
fun main(args: Array<String>) {
"String" * 5
}
operator fun String.times(times: Int) {
for (t in 0 until times) {
println(this)
}
}
估计会有很多小伙伴第一次看见这样的写法,如果写过Python的小伙伴的估计会很眼熟。times是操作方*的方法,我们这里把times做成了拓展方法,就有了上面的写法,很神奇吧
三、内部类
非静态内部类和静态内部类
java中也是存在静态内部类和非静态内部类的,关于这两个的区别和用法我就不在这里说了,可以百度一下,海量的文章供你参考。那Kotlin中的静态内部类和非静态内部类是如何写的呢?我们看代码:
class OuterClass {
//非静态内部类
inner class InnerClass
//静态内部类
class staticInnerClass
}
虽然代码就几行,但是我绝对没有糊弄事~。我们这里就是简单的表达一下,没有写成员变量,所以显得很精简了。静态内部类和非静态内部类的区别就在inner这个关键字上,带inner的类是非静态的,不带inner的类是静态的,就是这么简单。
匿名内部类
匿名内部类是Java中常用的了,在Kotlin中如何使用匿名内部类呢?我们从代码中分析,我写一个简单的例子
interface OnClickListener {
fun onClick();
}
class Test constructor(onClickListener: OnClickListener)
fun main(args: Array<String>) {
var test = Test(object : OnClickListener {
override fun onClick() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
}
首先我写了一个接口类,也就是类型为interface的类,包含了一个方法onClick();之后有写了一个名为Test的测试类,构造器接收一个类型为刚刚创建的接口类OnClickListener;在main方法中创建Test类的对象,我们可以看见,在创建Test对象的构造方法中实现了OnClickListener这个类,我们注意到前面有一个object关键字,这个就是匿名内部类的关键。
四、枚举
Kotlin中的枚举类型和Java中的枚举类型差不多,我们还是从代码入手:
enum class EnumClass{
ENUM1,ENUM2,ENUM3
}
fun main(args: Array<String>) {
println(EnumClass.ENUM1.ordinal)
println(EnumClass.ENUM2.ordinal)
println(EnumClass.ENUM3.ordinal)
EnumClass.values().map(::println)
}
其实枚举类型还是比较简单,我们先创建了一个枚举类EnumClass,其中有三个枚举成员;我们看main方法的代码,其中ordinal是枚举成员在枚举类的索引,是从0开始的。values().map返回了枚举类型的map类型。东西就是这么多。因为我平时使用int类型比较多,枚举用的还是比较少,如果之后用到了,再来补充