Kotlin实战读书笔记(四 面向对象)

2017-12-06  本文已影响0人  Pyrrha_89c6
  1. 继承
修饰符 相关成员 评注
final 不能被重写 类中的成员默认使用
open 可以被重写 需要明确表明
abstract 必须被重写 只能在抽象类中表明,抽象成员不能有实现
override 重写父类或接口的成员 若无final声明,默认开发
class Obj() // 不可继承
open class Obj : Clickable{ //加了open修饰符,可以继承
    fun method(){} //不可重写
    open fun method //可重写
    override fun click() {} //重写的open方法,可重写
}
abstract class Obj { //可以继承
    abstract fun method(){} //可重写
    fun method(){}//不可重写
    open fun method //可重写
}
修饰符 类成员 顶层声明
public 所有地方可见 所有地方可见
internal 模块可见 模块可见
protected 子类可见 -
private 类可见 本文件可见
  1. 类的构造方法
    • 明确写法
    class User(val name: String)
          等同于,下面最明确的写法
    class User constructor(_name: String){ //constructor主构函数或从构函数
        val name: String
        init{ //初始化代码块
            name = _name
        }
    }
    class User{ //从构造方法的使用
        constructor(name: String){...}
        constructor(name: String,age: Int){...}
    }
    
    • 继承与构造方法
    class Child(param: String) : Father(param) {...} //必须调用父类的构造方法
    class Child : Father() //子类无构造方法必须显示调用父类构造方法  
    
    • 私有构造方法
    class Obj private constructor(){}
    
    • 接口的属性
      interface User {
          val name: String  //必须重写
          val age: Int //可继承
              get() = 10
      }
      //三种实现方式
      class Student1(override val name): User
      class Student1: User{
          override val name: String
              get() = ""
      }
      class Student1: User{
          override val name: String = ""
      }
    
    • 私有的setter:
    class Obj {
       var counter: Int = 0
           private set
    }
    
  2. 编译器生成的方法:数据类和类委托
  1. object 关键字
    功能: 声明类的时候创建实例
    object Obj { //无构造方法
        val param: Int = 1
        fun method() = 2
    }
    Obj.param // 1
    Obj.method() //2
    
  2. 伴生对象:工厂方法,静态方法
    class A {
       companion object{ //注意companion关键字,伴生对象可实现接口继承对象
           fun foo() = 1 //相当于java中A的静态方法
       }
    }
    A.foo() 
    class B {
       companion object Comp{ //注意companion关键字
           fun foo() = 2 //相当于java中A的静态方法
       }
    }
     B.Comp.foo()  == B.foo()
     //在java中访问
     A.Companion.foo()
     B.Comp.foo()
    
     //对伴生对象扩展
     fun A.Companion.func() = ""
     fun B.Comp.func() = ""
    
  3. kotlin写法的匿名内部类
var count = 0
window.addMouseListener(
    object: MouseAdapter() {
        override fun mouseClicked(e : MouseEvent){ count++ } //可以直接访问外部变量
        override fun mouseEntered(e : MouseEvent){...}
    }
)
上一篇 下一篇

猜你喜欢

热点阅读