类和继承
类
Kotlin 中使用关键字 class 声明类
class Person {...}
构造函数
一个类可以有一个主构造函数和一个或多个次构造函数
次构造函数:前缀有 constructor的,可以直接委托或者通过别的次构造函数间接委托。委托到同一个类的另一个构造函数用 this 关键字即可:
class Person(var name: String) {//主构造函数,name为类属性
// var name: String = name
var age: Int = 18
constructor( name:String , age:Int) : this(name){//次构造函数
this.age = age
this.name = name
}
}
创建类的实例
val person = Person("hello")
val person1 = Person("world", 2018)
创建实例不需要关键字'new'
继承
/**
* The root of the Kotlin class hierarchy. Every Kotlin class
* has [Any] as a superclass.
*/
public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int
public open fun toString(): String
}
Any是所有kotlin类的超类,Any 并不是 java.lang.Object,除了 equals()、hashCode()和toString()外没有任何成员。
open class Person(var name: String)
class Coder(var skill: String, name: String) : Person(name)
//使用 super 关键字初始化其基类型
class Coder : Person {
constructor(name: String) : super(name)
}
类上的 open 标注与 Java 中 final 相反,它允许其他类从这个类继承。默认情况下,在 Kotlin 中所有的类都是 final
覆盖方法
Kotlin 需要显式标注可覆盖的成员(我们称之为开放)和覆盖后的成员:
open class Person {
open fun show(){}
}
class Coder : Person() {
override fun show() {}
}
override 的成员本身是开放的,它可以在子类中覆盖。如果你想禁止再次覆盖,使用 final 关键字:
//可覆盖
class Coder : Person() {
override fun show() {}
}
class Coder2 :Coder(){
override fun show() {
super.show()
}
}
//禁止再次覆盖
class Coder : Person() {
final override fun show() {}
}
覆盖属性
类似于覆盖方法,在超类中声明然后在派生类中重新声明的属性必须以 override 开头
属性和字段
var:可变的(相当于普通变量)
val:只读的(相当于final修饰的变量)
只读属性不允许 setter
val不能重新分配:
class Person {
val age: Int = 18
fun setAge(){
age = 20 //val cannot be reassigned
}
}