面试题答案
一键面试面临的问题
当一个类实现多个接口,且这些接口中存在相同签名的方法时,会产生方法冲突。编译器无法确定该类应使用哪个接口中的方法实现,从而导致编译错误。
解决方法
- 在实现类中重写该方法:在实现类中提供一个统一的方法实现,覆盖接口中的方法声明。例如:
interface Interface1 {
void sameMethod();
}
interface Interface2 {
void sameMethod();
}
class ImplementingClass implements Interface1, Interface2 {
@Override
public void sameMethod() {
// 统一的实现代码
}
}
- 调用特定接口的默认方法:如果接口中是默认方法,在实现类中可以通过接口名来指定调用哪个接口的默认方法。例如:
interface Interface1 {
default void sameMethod() {
System.out.println("Interface1's sameMethod");
}
}
interface Interface2 {
default void sameMethod() {
System.out.println("Interface2's sameMethod");
}
}
class ImplementingClass implements Interface1, Interface2 {
@Override
public void sameMethod() {
Interface1.super.sameMethod();
}
}
对多态特性的影响
- 重写方法实现:通过重写方法实现,多态特性不受影响。因为实现类提供了单一的方法实现,无论通过哪个接口引用该对象,调用的都是实现类重写后的方法。
- 调用特定接口默认方法:这种方式在一定程度上破坏了多态的纯粹性。因为调用特定接口的默认方法,依赖于对象声明时的接口类型,而非运行时对象的实际类型。例如:
Interface1 obj1 = new ImplementingClass();
Interface2 obj2 = new ImplementingClass();
obj1.sameMethod(); // 调用Interface1的默认方法
obj2.sameMethod(); // 调用Interface2的默认方法
这种情况下,调用的结果取决于对象声明的接口类型,而非对象的实际类型,与传统多态基于运行时类型的特性有所不同。