Kotlin基础语法学习记录

  • var和val的区别
    var是一个普通的变量,和java中声明变量的方式一样。
    val是一个只读变量,相当于java中变量前使用了final修饰。
  • lateinit和lazy
    lateinit只用于var,而lazy只用于val
    lateinit不能用在可控属性上和java的基本类型上,否则会报错
    错误:lateinit var amount:Double
  • inline内联函数
    调用一个方法是一个压栈和出栈的过程,调用方法时将栈指针压入方法栈,然后执行方法体,方法结束时栈指针出栈,这个压栈和出栈的过程会耗费资源,这个过程中传递形参也会耗费资源。
    为什么需要inline
    有些简单的方法会被频繁调用,什么叫简单的方法呢,举个例子:
    fun check(lock: Lock, body: () -> T): T {
    lock.lock()
    try {
    return body()
    } finally {
    lock.unlock()
    }
    }
    这个check方法的方法中,不会将它的形参再传递给其他方法。我们调用一下check方法
    check(l, {"我是lambda方法体"})//l是一个Lock对象
    对于编译器来说,调用check方法就要将参数l和lambda表达式{“我是lambda方法体"}进行传递,还要将check方法进行压栈处理,这个过程就会耗费资源。
    如果我们把check方法删除,直接执行check的方法体呢?这样做的效果和调用check方法是一样,但是代码看起来就太不好看了,而且也会出现代码冗余。于是就把它抽成了check方法,那么如上所述,一旦这个方法被频繁调用,压栈出栈将会带来性能问题。针对这个问题,kotlin引入了inline关键字。我们在check方法前加上inline,然后再调用check方法,编译器就会在编译期帮我们进行优化,将我们写的代码:
    check(l, {"我是lambda方法体"})//l是一个Lock对象
    换成
    l.lock() try { return "我是lambda方法体" } finally { l.unlock() }
    也就是说inline关键字实际上增加了代码量,但是提升了性能,而且增加的代码是在编译器执行的,对程序可读性不会造成影响。
  • Kotlin中open,final,abstract修饰符
    在Kotlin中,所有的类默认都是final的,如果你需要允许它可以被继承,那么你需要使用open声明:
    //这个类具有open属性,可以被其他类继承
    open class People: Speakable{
    //open的方法被实现和覆写,该方法也是open
    override fun say() {}
    //final属性的方法,不可被覆写
    fun sayHello() {}
    //open属性的方法,可以被继承和覆写
    open fun sayName() {}
    }
    当然,也可以阻止某些方法被复写:
    open class People: Speakable{
    //final修饰一个原本具有open属性的方法,使其变得不可再被覆写
    final override fun say() {}
    }
    在Kotlin中,abstract的用法几乎和java一致,值得一提的是,当你使用abstract修饰符的时候,可以忽略open修饰符,因为被abstract修饰的类默认具有open属性。
  • Kotlin中json生成Bean的插件JsonToKotlinClass
  • Kotlin中用object修饰的类,被称之为静态类;使用“companion objet”修饰静态方法,可以使用类名.方法名的形式调用。

你可能感兴趣的:(Kotlin基础语法学习记录)