[Kotlin]面向对象

Kotlin vs Java

  1. Kotlin中的类默认是声明为public final, 如果需要这个类有可以被继承,需要在类名前加关键字open, 同时所有能被重写的方法前也需要加open关键字
  2. 嵌套类默认不是内部类,他们不再隐式包含他们外部类的引用
  3. Kotlin用冒号:取代了Java中的extendsimplements关键字

Kotlin中的接口

Kotlin中的接口可以包含抽象方法,也可以包含非抽象方法。

定义接口

跟Java中一样,使用interface定义接口:

interface Book {
  fun open()
  fun showMe() {
    println("I am a book")
  }
}

实现接口

实现这个接口的子类必须实现抽象方法,可以继承非抽象方法的默认实现,也可以重写非抽象方法。
有一种情况子类必须重写父接口的非抽象方法:当子类实现多个接口且多个接口中有相同名字的非抽象方法。
子类调用父接口格式:`super.showMe()

修饰符

类中的四个访问修饰符

  1. final: 默认修饰符,不能被重写
  2. open:需要显式声明能够被重写
  3. abstract:只能被用在抽象类中,必须被重写
  4. override:重写父类中的成员, 默认也是open的,如果不想被子类重写,需要显式增加final修饰符

可见性修饰符

  1. 默认public
  2. protectedprivate
  3. 去除Java中的缺省包可见修饰符,增加了internal修饰符为模块可见
    注意:
1. 一个类的扩展方法不能访问该类的private和protected成员
2. 嵌套类的private成员对外部类不可见

内部类和嵌套类

嵌套类:

Kotlin嵌套类无法访问外部类实例

class Outer {
  class Nested {
  
  }
}

内部类

内部类可以方位外部类实例

class Outer {
  inner class Inner {
    fun getOuterInstance() : Outer = this@outer
  }
}

构造方法

Kotlin中构造方法分主构造方法和次构造方法,其中主构造方法定义在类体外,次构造方法定义在类内部。主构造方法最多能有一个,次构造方法可以有多个。
主构造方法样例: 如果主构造方法没有注解或者可见性说明,可以省略关键字constructor

class User constructor (name: String) {
  val localName: String
  init {
    localName = name  
  }
}

主构造简洁版:

class User(val name: String) {

}

次构造方法样例:

class User {
  constructor(name:String) {
    super(name)
  }
}

数据类

  • data关键字修饰,自动生成equals(), hashCode()和toString()方法
  • 属性建议声明为常量,可以避免很多潜在问题。通过copy()方法实现重新赋值
data class User(val name:String, val age: Int)

object关键字

  • 单例
  • 取代Java中访问static成员功能
  • 取代Java中的匿名内部类
object Book{
  val allChapters = arrayListOf()
  fun open() {
    println("Open the book")
  }
}

Book.allChapters.add(Chapter())
Book.open()

对象表达式

subscribeButton.setOnClickListener(object : View.OnClickListener {
 override fun onClick(v: View) {
    ...
  }
})

companion对象

一个类内部的object访问外部类的私有成员

class School {
  val type: String
  constructor (type: String) {
    this.type = type
  }
  companion object {
    fun newPrimarySchool() = School('primary')
  }
  companion object {
    fun newHighSchool() = School('high')
  }
}

密封类(Sealed Class)

  • 子类可数
  • 子类必须和父类定义在同一个文件中

你可能感兴趣的:([Kotlin]面向对象)