Kotlin vs Java
- Kotlin中的类默认是声明为
public final
, 如果需要这个类有可以被继承,需要在类名前加关键字open
, 同时所有能被重写的方法前也需要加open
关键字 - 嵌套类默认不是内部类,他们不再隐式包含他们外部类的引用
- Kotlin用冒号
:
取代了Java中的extends
和implements
关键字
Kotlin中的接口
Kotlin中的接口可以包含抽象方法,也可以包含非抽象方法。
定义接口
跟Java中一样,使用interface定义接口:
interface Book {
fun open()
fun showMe() {
println("I am a book")
}
}
实现接口
实现这个接口的子类必须实现抽象方法,可以继承非抽象方法的默认实现,也可以重写非抽象方法。
有一种情况子类必须重写父接口的非抽象方法:当子类实现多个接口且多个接口中有相同名字的非抽象方法。
子类调用父接口格式:`super<Book>.showMe()
修饰符
类中的四个访问修饰符
- final: 默认修饰符,不能被重写
- open:需要显式声明能够被重写
- abstract:只能被用在抽象类中,必须被重写
-
override:重写父类中的成员, 默认也是
open
的,如果不想被子类重写,需要显式增加final
修饰符
可见性修饰符
- 默认
public
-
protected
,private
- 去除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<Chapter>()
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)
- 子类可数
- 子类必须和父类定义在同一个文件中