Kotlin基础(1)

幻昼 2021年03月01日 262次浏览

val var

  1. val定义的为只读类型,通过把kotlin编译成字节码再反编译成Java发现,其实是Java加了final关键字。
  2. var定义的为可读写类型

lateinit

kotlin变量没有默认值,一般都要初始化。该关键字表示先不初始化,过一会再初始化

字符串模板

"str的长度:${str.length}"   // 表达式
"你的名字:$name"    // 变量

"""
strxxx
"""         // 一段字符串

属性与字段

与java不同,在java类里面,属性就是字段。在kotlin中区分开,像如下定义的的为字段,使用跟Java一样。背后其实是自动生成了幕后字段,属性不存值,交给幕后字段存

var name: String

如下定义的为 属性 + get + set =字段。get 和 set没有出现field,则不生成幕后字段。

var id: Int// 是一个属性  + get + set
get() = 0
set(value) {
    id = value
}

方法、函数

返回空

fun func1(name: String) {//void
    println(name)
}

fun func1(name: String):Unit {//void
    println(name)
}
fun func1(a:Int,b:Int):Int {
    return a+b
}

一句简化

fun sum(a: Int,b: Int) = a + b

主、次构造函数

主构造函数在类名后面加(),里面填输入参数,直接赋值到字段或者配合类体里面的 init 代码块完成类的初始化。

次构造函数在类体里面通过constructor关键字定义

class User(id: Int) {
    var id: Int = id
    var name: String

    init {
        this.name = ""
    }

    constructor(name: String, id: Int) : this(id) {
        this.name = name
    }

}

非空类型 与 可空类型

Kotlin默认变量是不可空类型,要让变量可以为空,需在其后面加上?,如Person?。

加上了问号与不加问号属于不同类型,不能相互赋值。从Kotlin字节码反编译成Java可以看到,默认非空是加了很多非空注解和非空检查。

循环与区间

for

for(item in items){}

.. 闭区间,如 0..5

until 后面为开区间 0 until 5 = [0,5)

downTo 递减

step 在区间后面加上可以设置步长

操作符重载

与c++类似,也有运算符重载。使用 operator 关键字

data class Box(val a: Int, val b: Int)

operator fun Box.plus(other: Box): Box {
    return Box(this.a + other.a, this.b + other.b)
}

fun main() {
    val box1 = Box(1, 2)
    val box2 = Box(3, 5)
    val box = box1 + box2
    println(box)
}