📜  Kotlin继承(1)

📅  最后修改于: 2023-12-03 14:43:42.721000             🧑  作者: Mango

Kotlin继承

继承是面向对象编程中一个非常基础的概念,Kotlin作为一门完全支持面向对象编程的语言,当然也支持继承。本篇文章将会介绍Kotlin中的继承相关的概念和用法。

基本概念

在Kotlin中,继承是通过使用:来实现的。具体的语法如下:

open class Parent {
    // 父类代码
}

class Child : Parent() {
    // 子类代码
}

上述代码中,Child类继承了Parent类,使用了:符号。继承的语法比较简单,需要注意的是,被继承的类必须被声明为open,否则无法被继承。而子类则需要使用class关键字来声明。

在继承中,子类拥有父类的所有属性和方法。但是,如果父类的成员被声明为private,那么子类则无法访问该成员。

另外,Kotlin中还有一个叫做interface的概念,它与继承有一些类似之处。interface定义了一组属性和方法,而类则可以实现interface。与继承不同的是,一个类可以实现多个interface,但只能继承一个类。

重写

Kotlin中,子类可以重写父类的方法和属性。比如:

open class Parent {
    open fun foo() {
        println("Parent.foo")
    }
}

class Child : Parent() {
    override fun foo() {
        println("Child.foo")
    }
}

上述代码中,Parent中的foo方法被声明为open,而Child中则通过override关键字来重写了foo方法。当然,重写时也可以使用super来调用父类的方法。

Kotlin中,如果不想允许子类重写某个方法或属性,可以使用final关键字来声明。比如:

open class Parent {
    final fun foo() {
        println("Parent.foo")
    }
}

class Child : Parent() {
    // 无法重写Parent的foo方法
}
抽象类和接口

在Kotlin中,abstract关键字可以用来声明抽象类。抽象类不能被实例化,只能被子类继承。抽象类一般用来定义一些通用的属性和方法,具体的实现则留给子类。比如:

abstract class Person {
    abstract fun getName(): String
}

class Student : Person() {
    override fun getName(): String {
        return "Student"
    }
}

上述代码中,Person类被声明为抽象类,其中的getName方法则被声明为抽象方法。Student类继承了Person类,并实现了getName方法。由于Person类不能被实例化,因此Student也不能被直接实例化。

另外,Kotlin中还支持interface,它也可以用来定义一组属性和方法。与抽象类不同的是,interface中的所有方法都是抽象的,因此不需要使用abstract关键字来修饰。比如:

interface GetName {
    fun getName(): String
}

class Student : GetName {
    override fun getName(): String {
        return "Student"
    }
}

上述代码中,GetName接口定义了getName方法,而Student类实现了GetName接口,并实现了getName方法。

总结

Kotlin中的继承和Java中基本相同,使用:来实现继承关系。除了继承,Kotlin中还支持抽象类和接口,它们都可以用来定义一组属性和方法。在子类中,可以通过override关键字来重写父类的方法和属性。而如果一个方法或属性不希望被重写,可以使用final关键字来声明。