val var
- val定义的为只读类型,通过把kotlin编译成字节码再反编译成Java发现,其实是Java加了final关键字。
- 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)
}