Kotlin学习笔记:类声明、修饰符、伴生对象,替代static、单例模式...

一、Kotlin类声明:

​​​class MainActivity : AppCompatActivity()

class MainActivity : AppCompatActivity(), OnClickListener

Kotlin的类默认都是public final的,如果不需要final修饰符,可以手动在class前添加open修饰符

open class MainActivity : AppCompatActivity()

open class MainActivity : AppCompatActivity(), OnClickListener

二、

Kotlin修饰符:

private 、protected 、 public跟java的相同。
internal 是kotlin特有的修饰符,只有同个模块(Module)的类才可以访问,其他模块的则不能访问

三、Kotlin伴生对象,替代static

public class StringUtils {
    public static boolean isEmpty(String string){
        return "".equals(string);
    }
}

在Java中我们常看到上述写法,但是在kotlin中却不行,因为kotlin中没有static修饰符,有两种方法可以替代,一是jvm static注释的方法,第二种就是用伴生对象替代,如下:

class StringUtils {
    companion object {
        fun isEmpty(string: String): Boolean {
            return "" == string;
        }
    }
}

companion object要写在一个类的内部,作为这个类的伴生对象存在。

四、Kotlin单例模式:

class Singleton private constructor() {
    companion object {
        fun getInstance(): Singleton {
            return Holder.instance
        }
    }

    private object Holder {
        val instance = Singleton()
    }
}

五、Kotlin动态代理:

/**
 * 动态代理
 */

    interface Animal{
        fun bark()
    }

    class Dog:Animal{
        override fun bark() {
            println("汪汪")
        }
    }

    class Zoo(animal: Animal) : Animal by animal

    fun main() {
        Zoo(Dog()).bark()
    }

kotlin会动态代理在编译时转为静态代理去调用,所以kotlin的动态代理一定比java的动态代理的效率高。因为java的动态代理是通过一系列反射实现的。

六、Kotlin循环:

    for (i in 1..10){
        println(i)
    }
    //结果:打印1到10

    for (i in 1 until  10){
        println(i)
    }
    //结果:打印1到9

    for (i in 10 downTo 1){
        println(i)
    }
    //结果:打印10到1

    for (i in 1..10 step 2){
        println(i)
    }
    //结果:打印1,3,5,7,9

    repeat(10){
        println(it)
    }
    //结果:打印0到9


    val list: ArrayList<String> = arrayListOf("a", "b", "c", "d")

    //类似java的写法
    for (str: String in list) {
        println(str)
    }

    //kotlin 解构写法
    for ((index,str) in list.withIndex()){
        println("第${index}个元素是$str")
    }
THE END