Android-开发笔记-kotlin基础
未完待续。
1. 流程处理
when
| /* fizz buzz problem*/ | 
2. 类
自定义访问器
| class Rectangle(val height: Int, val width: Int) { | 
继承与扩展
| /* 可重写成员函数*/ | 
- Java类的默认方法是open, 而Kotlin是final, 在open类中仅open函数和override的函数可以在子类中重写, 
 当想在open类中override的方法防止被子类重写,可以将此方法标注为final, 来限制他被重写。- open class Clickable { 
 open fun click() = println("clickable")
 }
 open class Button: Clickable() {
 final override fun click() {
 println("button clickable")
 }
 }
- Kotlin中比Java多了一个internal修饰符,其作用是在模块中可见。Kotlin中的默认声明是public,而且在Kotlin中的 
 protected修饰符只能在类和他的子类中可见,不像java一样在同一个包中访问protected的成员。类的扩展函数不能访问类的
 private和protected成员。
- 嵌套类和内部类在Java与Kotlin中的对应关系 
| 类A在另一个类B中声明 | 在Java中 | 在Kotlin中 | 
|---|---|---|
| 嵌套类(不存储外部引用) | static class A | class A | 
| 内部类(存储外部类的引用) | class A | inner class A | 
- Inner类访问Outer类 - class Outer { 
 inner class Inner {
 fun getOuterReference(): Outer = this@Outer
 }
 }
- 密封类的表达式-所有的直接子类必须嵌套在父类中, 关键字用sealed - sealed class Expr { 
 class Num(val value: Int): Expr()
 class Sum(val left: Expr, val right: Expr): Expr()
 }
 fun eval(e: Expr): Int =
 when(e) {
 is Expr.Num -> e.value
 is Expr.Sum -> eval(e.right) + eval(e.left)
 }
 fun main() {
 val left = Expr.Num(5)
 val right = Expr.Num(3)
 val sum = Expr.Sum(left, right)
 println(eval(sum)) /* 8 */
 }
- 继承父类即使他没有参数也必须要调用父类的狗仔方法,也就是在父类名称后面加空的括号,但是如果是实现 
 接口,不需要在他的名称后面加括号。
- 使用委托类 - by - class CountingTest<T>( 
 val innerSet : MutableCollection<T> = HashSet<T>()
 ) : MutableCollection<T> by innerSet {
 var objectsAdded = 0
 override fun add(element: T): Boolean {
 objectsAdded++
 return innerSet.add(element)
 }
 override fun addAll(elements: Collection<T>): Boolean {
 objectsAdded += elements.size
 return innerSet.addAll(elements)
 }
 }
 fun main() {
 val cset = CountingTest<Int>()
 cset.addAll(listOf(1, 2, 3))
 println("${cset.objectsAdded} object awere added, ${cset.size} remain")
 }
- 对象声明是Kotlin中定义单例类的方法。 
- 伴生对象代替了Java的静态方法和字段定义。
3. run, also, apply, let, with
| inline fun <T, R> with(receiver: T, block: T.() -> R): R { |