📅  最后修改于: 2023-12-03 14:43:42.721000             🧑  作者: Mango
继承是面向对象编程中一个非常基础的概念,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
关键字来声明。