面试题答案
一键面试Kotlin接口默认方法
- 类实现接口时的要求:
- 类实现接口时,对于接口中的默认方法不是必须重写的。如果类没有特殊需求,可以直接使用接口提供的默认实现。
- 方法重写规则:
- 当类想要提供不同于接口默认实现的行为时,可以重写默认方法。重写时,方法修饰符必须与接口中默认方法保持一致或更宽松(如接口默认方法是
open
,重写方法可以是open
或final
)。
- 当类想要提供不同于接口默认实现的行为时,可以重写默认方法。重写时,方法修饰符必须与接口中默认方法保持一致或更宽松(如接口默认方法是
代码示例:
interface MyInterface {
fun greet() = "Hello from interface"
}
class MyClass : MyInterface {
override fun greet() = "Hello from MyClass"
}
抽象类中的抽象方法
- 类继承抽象类时的要求:
- 当一个类继承抽象类时,必须实现抽象类中的所有抽象方法,除非该类本身也声明为抽象类。
- 方法重写规则:
- 重写抽象方法时,方法修饰符不能比抽象类中抽象方法的修饰符更严格。例如,抽象类中抽象方法是
open
,重写方法不能是private
。
- 重写抽象方法时,方法修饰符不能比抽象类中抽象方法的修饰符更严格。例如,抽象类中抽象方法是
代码示例:
abstract class AbstractClass {
abstract fun doSomething()
}
class SubClass : AbstractClass() {
override fun doSomething() {
println("Implemented in SubClass")
}
}
抽象类中的非抽象方法
- 类继承抽象类时的要求:
- 继承抽象类的子类可以直接使用抽象类中的非抽象方法,无需重写,除非子类有特殊的业务需求。
- 方法重写规则:
- 如果子类想要重写非抽象方法,该方法在抽象类中必须是
open
的,并且重写方法的修饰符不能比抽象类中该方法的修饰符更严格。
- 如果子类想要重写非抽象方法,该方法在抽象类中必须是
代码示例:
abstract class AbstractClass2 {
open fun sayHello() = "Hello from AbstractClass2"
}
class SubClass2 : AbstractClass2() {
override fun sayHello() = "Hello from SubClass2"
}
总结不同点
- 实现/继承要求:接口默认方法不强制实现,抽象类的抽象方法强制实现,抽象类非抽象方法可直接使用。
- 重写规则:接口默认方法重写要保持或放宽修饰符;抽象类抽象方法重写不能使修饰符更严格;抽象类非抽象方法重写前提是该方法
open
且重写时修饰符不能更严格。