var val
var:同时有 getter 和 setter。
val:只有 getter。
val声明代表只读
不可变( immutable )和只读( read-only )是有区别滴
下面例子中,age每次被访问的值都不同
class Person(val birthDay: DateTime) {
val age: Int
get() = yearsBetween(birthDay, DateTime.now())
}
不可以同时声明多个变量
//val xmax, ymax = 100
与Java不同:作用域不同,变量名可重(名称遮蔽)
fun outter() {
var a:String
fun inner() {
var a:String
}
}
static
没有 static 关键字
- companion object包裹
class TestA {
//用companion object包裹方法,实现java中static的效果
companion object {
fun testA() {
}
fun testB() {
}
}
}
TestA.testA()
TestA.testB()
- @JvmStatic 注解
object ATest {
@JvmStatic
fun testA() { }
}
ATest.testA()
const
//public final static
const val constObject: String = "constObject"
as
导包
import org.test.Message as testMessage // testMessage 代表“org.test.Message”
转型
fun testAs(a: Int?, obj: String?) {
val m1: Int = a as Int
val m2: Int? = a as? Int
}
open
abstract class A {
abstract fun getA()
open fun getB() {}
}
class B : A() {
override fun getA() {}
override fun getB() {}
}
to
集合字面量
val list = listOf("Saab", "Volvo")
val map = mapOf("firstName" to "John", "lastName" to "Doe")
to 中缀
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)
自定义中缀
infix fun <T> T.into(other: Collection<T>): Boolean = other.contains(this)
by
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
println(lazyValue)// computed! "Hello"
println(lazyValue)//"Hello" 之后的调用只会获取到首次保留的结果
by 委托模式
委托模式 = 代理模式
interface Call {
fun printStr(str: String)
fun printStr2(str: String)
}
class RealCall : Call {
override fun printStr(str: String) {
println("RealCallstr=$str")
}
override fun printStr2(str: String) {
println("RealCallstr222=$str")
}
}
class Delegate(val call: Call) : Call by call {
override fun printStr(str: String) {
println("Delegatestr----start")
call.printStr(str)
println("Delegatestr----end")
}
}
when
fun testWhen2(any: Any) = when (any) {
any is Int -> 1 //有any is
any is String -> 2 //有any is
else -> 3 //结果只走else分支 返回3
}
//正确写法
fun testWhen3(any: Any) = when (any) {
is String -> any.length //无any
is List<*> -> any.size
else -> 0
}
init
匿名内部类
Java 双{{写法
ArrayList<String> list = new ArrayList<String>() { {
add("2333");
add("666");
} };
Kotlin init
fun main() {
val list = object : ArrayList<String>() {
init {
add("2333")
add("666")
}
}
}
网友评论