继承
对比Object
在kotlin中,所有的类都继承于 Any类
,这个Any类
类似于Java 中的Object类,但是不等于。默认情况下都不需要写明kotlin的类继承与Any类
。
默认方法
Any类默认提供了三个方法。
equals() //字符串的比较
hashCode() //返回字符串的哈希码
toString() //将对象转换为字符串输出
open关键词
如果一个类要被继承,就需要增加open
关键词。
继承的基本格式为 class
+ 继承的类
+ :
+ 被继承的类
。
open class Base(p: Int) // 定义基类
class Derived(p: Int) : Base(p)
方法的重写
修饰符
类的成员方法最基本的有两种修饰符:
- final
- open
final
关键词不允许继承的类重写该方法。open
关键词允许继承的类重写该方法。
默认不天剑关键词的时候是不允许重写该方法。
override关键词
如果某一个方法需要被重写,需要在前面加上前缀override
关键词。
例如
/**用户基类**/
open class Person{
open fun study(){ // 允许子类重写
println("我毕业了")
}
}
/**子类继承 Person 类**/
class Student : Person() {
override fun study(){ // 重写方法
println("我在读大学")
}
}
fun main(args: Array<String>) {
val s = Student()
s.study();
}
输出结果为
我在读大学
super方法
实例
/**用户基类**/
open class Person{
open fun study(){ // 允许子类重写
println("我毕业了")
}
}
/**子类继承 Person 类**/
class Student : Person() {
override fun study(){ // 重写方法
println("我在读大学")
super.study()
}
}
fun main(args: Array<String>) {
val s = Student()
s.study();
}
输出结果为:
我在读大学
我毕业了
更多关于继承的内容参见:
接口
关于什么是接口
参见以下的文章:
什么是接口?
定义接口
interface MyInterface {
fun bar() // 未实现
fun foo() { //已实现
// 可选的方法体
println("foo")
}
}
实现接口
class Child : MyInterface {
override fun bar() {
// 方法体
}
}
接口的属性
接口中的属性只能是抽象属性,也就是说接口中的属性不能赋初始值。
其次实现接口的时候,必须重写属性。
举个例子:
interface MyInterface{
var name:String //name 属性, 抽象的
}
class MyImpl:MyInterface{
override var name: String = "runoob" //重写属性
}
综合实例
interface MyInterface {
var name:String //name 属性, 抽象的
fun bar()
fun foo() {
// 可选的方法体
println("foo")
}
}
class Child : MyInterface {
override var name: String = "runoob" //重写属性
override fun bar() {
// 方法体
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();
println(c.name)
}
输出结果为:
foo
bar
runoob