MST

星途 面试题库

面试题:Kotlin接口默认方法与抽象类方法在继承策略上的差异

阐述Kotlin接口默认方法和抽象类中的抽象方法、非抽象方法在继承策略方面的不同点,包括类实现接口或继承抽象类时的要求、方法重写规则等,并结合代码示例详细说明。
18.0万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

Kotlin接口默认方法

  1. 类实现接口时的要求
    • 类实现接口时,对于接口中的默认方法不是必须重写的。如果类没有特殊需求,可以直接使用接口提供的默认实现。
  2. 方法重写规则
    • 当类想要提供不同于接口默认实现的行为时,可以重写默认方法。重写时,方法修饰符必须与接口中默认方法保持一致或更宽松(如接口默认方法是open,重写方法可以是openfinal)。

代码示例:

interface MyInterface {
    fun greet() = "Hello from interface"
}

class MyClass : MyInterface {
    override fun greet() = "Hello from MyClass"
}

抽象类中的抽象方法

  1. 类继承抽象类时的要求
    • 当一个类继承抽象类时,必须实现抽象类中的所有抽象方法,除非该类本身也声明为抽象类。
  2. 方法重写规则
    • 重写抽象方法时,方法修饰符不能比抽象类中抽象方法的修饰符更严格。例如,抽象类中抽象方法是open,重写方法不能是private

代码示例:

abstract class AbstractClass {
    abstract fun doSomething()
}

class SubClass : AbstractClass() {
    override fun doSomething() {
        println("Implemented in SubClass")
    }
}

抽象类中的非抽象方法

  1. 类继承抽象类时的要求
    • 继承抽象类的子类可以直接使用抽象类中的非抽象方法,无需重写,除非子类有特殊的业务需求。
  2. 方法重写规则
    • 如果子类想要重写非抽象方法,该方法在抽象类中必须是open的,并且重写方法的修饰符不能比抽象类中该方法的修饰符更严格。

代码示例:

abstract class AbstractClass2 {
    open fun sayHello() = "Hello from AbstractClass2"
}

class SubClass2 : AbstractClass2() {
    override fun sayHello() = "Hello from SubClass2"
}

总结不同点

  • 实现/继承要求:接口默认方法不强制实现,抽象类的抽象方法强制实现,抽象类非抽象方法可直接使用。
  • 重写规则:接口默认方法重写要保持或放宽修饰符;抽象类抽象方法重写不能使修饰符更严格;抽象类非抽象方法重写前提是该方法open且重写时修饰符不能更严格。