Kotlin 中一些特殊类

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情

一、嵌套类

1)、Kotlin 中的嵌套类类似 Java 中的静态内部类,不会持有外部类的引用

//定义一个外部类
class SomeSpecificClass1(val attr: String){

    //定义一个嵌套类
    class NestedClass(val nestedAttr: String){

        fun nestedMethod(){
             print("My name is $nestedAttr")
        }
    }
}

fun main() {
    //嵌套类测试
    val nested = SomeSpecificClass1.NestedClass("erdai")
    nested.nestedMethod()
}
//打印结果
My name is erdai

二、内部类

1)、定义一个类的时候,在其前面加上 inner 关键字修饰

2)、Kotlin 中的内部类类似 Java 中的非静态内部类

//定义一个外部类
class SomeSpecificClass2(val attr: String){

    //定义一个内部类
    inner class InnerClass(val innerAttr: String){

        fun nestedMethod(){
            println("My name is $innerAttr, My Parent Class is $attr")
        }
    }
}

fun main() {
    //内部类测试
    val inner = SomeSpecificClass2("SomeSpecificClass2").InnerClass("erdai")
    inner.nestedMethod()
}

//打印结果
My name is erdai, My Parent Class is SomeSpecificClass2

三、匿名内部类

在 Java 中创建匿名内部类,只需要把这个类直接 new 出来,以 View 的 setOnClickListener 为例:

view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        
    }
});

上述例子在 Kotlin 中有两种写法,如下:

//方式一:object 方式,类似 Java 匿名内部类
view.setOnClickListener(object : View.OnClickListener{
    override fun onClick(v: View?) {
        
    }
})

//方式二:Lambda 表达式
view.setOnClickListener { v ->

}

四、枚举类

1)、Kotlin 中声明一个枚举类,使用 enum class 修饰

2)、枚举类的属性可以调用构造方法赋值,多个属性中间使用 , 隔开

3)、枚举类的每个属性都是全局单例的

//Java 中写法
enum Season{

    SPRING("春"),SUMMER("夏"),AUTUMN("秋"),WINTER("冬");

    private String name;

    Season(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


//Kotlin 中写法
enum class SomeSpecificClass5(val attr: String){
    SPRING("春"), SUMMER("夏"),AUTUMN("秋"),WINTER("冬")
}

fun main() {
    //枚举类测试
    println(SomeSpecificClass5.SPRING.attr)
}
//打印结果

五、模版类

1)、基于泛型实现

class SomeSpecificClass6<T>(var attr: T){

    fun getMyAttr(): T{
        return attr
    }
}

fun main() {
    //模版类测试
    val template1 = SomeSpecificClass6<String>("erdai")
    println(template1.getMyAttr())
		
    val template2 = SomeSpecificClass6<Int>(666)
    println(template2.getMyAttr())
}

//打印结果
erdai
666

六、单例类

1)、Kotlin 中,我们只需要使用 object 关键字去替换 class 关键字就可以去定义一个单例类了

2)、调用单例类中的方法也比较简单,直接使用类名 . 上方法就可以了,类似于 Java 中的静态方法调用方式

object Singleton{
    fun singletonTest(){
        println("singletonTest in Kotlin is called.")
    }
}

fun main() {
    //单例类测试
    Singleton.singletonTest()
}

//打印结果
singletonTest in Kotlin is called.

七、伴生类

1)、使用 companion object 为一个类创建一个伴生类,然后调用这个伴生类的方法,这个方法不叫静态方法,但是可以当作静态方法调用

class SomeSpecificClass8{
    companion object{
        fun getCompanionMethod(): String{
            return "erdai666"
        }
    }
}

fun main() {
    //伴生类测试
    println(SomeSpecificClass8.getCompanionMethod())
}

八、类型别名

1)、使用 typealias 关键字定义一个类型别名

typealias a = (String,Int) -> String

inline fun test(params1: String,params2: Int, aliasA: a) : String{
    return aliasA(params1,params2)
}

fun main() {
    val test = test("erdai", 666) { params1, param2 ->
        params1 + param2
    }
    println(test)
}
//打印结果 
erdai666

九、总结

本篇文章我们介绍了 Kotlin 中的一些类:

1、嵌套类

2、内部类

3、匿名内部类

4、枚举类

5、模版类

6、单例类

7、伴生类

8、类型别名

大家可以类比 Java 去学习,这样能够加深你的印象

好了,本篇文章到这里就结束了,希望能给你带来帮助 🤝