继承

对比Object

在kotlin中,所有的类都继承于 Any类,这个Any类类似于Java 中的Object类,但是不等于。默认情况下都不需要写明kotlin的类继承与Any类

默认方法

Any类默认提供了三个方法。

  1. equals() //字符串的比较
  2. hashCode() //返回字符串的哈希码
  3. toString() //将对象转换为字符串输出

open关键词

如果一个类要被继承,就需要增加open关键词。
继承的基本格式为 class + 继承的类 + : + 被继承的类

  1. open class Base(p: Int) // 定义基类
  2. class Derived(p: Int) : Base(p)

方法的重写

修饰符

类的成员方法最基本的有两种修饰符:

  1. final
  2. open

final关键词不允许继承的类重写该方法。
open关键词允许继承的类重写该方法。
默认不天剑关键词的时候是不允许重写该方法。

override关键词

如果某一个方法需要被重写,需要在前面加上前缀override关键词。
例如

  1. /**用户基类**/
  2. open class Person{
  3. open fun study(){ // 允许子类重写
  4. println("我毕业了")
  5. }
  6. }
  7. /**子类继承 Person 类**/
  8. class Student : Person() {
  9. override fun study(){ // 重写方法
  10. println("我在读大学")
  11. }
  12. }
  13. fun main(args: Array<String>) {
  14. val s = Student()
  15. s.study();
  16. }
  1. 输出结果为
  1. 我在读大学

super方法

在子类中也可以通过super来调用父类的方法。

实例

  1. /**用户基类**/
  2. open class Person{
  3. open fun study(){ // 允许子类重写
  4. println("我毕业了")
  5. }
  6. }
  7. /**子类继承 Person 类**/
  8. class Student : Person() {
  9. override fun study(){ // 重写方法
  10. println("我在读大学")
  11. super.study()
  12. }
  13. }
  14. fun main(args: Array<String>) {
  15. val s = Student()
  16. s.study();
  17. }

输出结果为:

  1. 我在读大学
  2. 我毕业了

更多关于继承的内容参见:

Kotlin 继承 | 菜鸟教程


接口

关于什么是接口

参见以下的文章:
什么是接口?

定义接口

  1. interface MyInterface {
  2. fun bar() // 未实现
  3. fun foo() { //已实现
  4. // 可选的方法体
  5. println("foo")
  6. }
  7. }

实现接口

  1. class Child : MyInterface {
  2. override fun bar() {
  3. // 方法体
  4. }
  5. }

接口的属性

接口中的属性只能是抽象属性,也就是说接口中的属性不能赋初始值
其次实现接口的时候,必须重写属性
举个例子:

  1. interface MyInterface{
  2. var name:String //name 属性, 抽象的
  3. }
  4. class MyImpl:MyInterface{
  5. override var name: String = "runoob" //重写属性
  6. }

综合实例

  1. interface MyInterface {
  2. var name:String //name 属性, 抽象的
  3. fun bar()
  4. fun foo() {
  5. // 可选的方法体
  6. println("foo")
  7. }
  8. }
  9. class Child : MyInterface {
  10. override var name: String = "runoob" //重写属性
  11. override fun bar() {
  12. // 方法体
  13. println("bar")
  14. }
  15. }
  16. fun main(args: Array<String>) {
  17. val c = Child()
  18. c.foo();
  19. c.bar();
  20. println(c.name)
  21. }

输出结果为:

  1. foo
  2. bar
  3. runoob