让我们考虑以下代码
interface P {
public void doSomething();
}
interface Q {
public void doSomething();
}
class A {
public void doSomething() {
}
}
class B {
public void doSomething() {
}
}
class C implements P,Q {
public void doSomething(){
// implementation
}
}
class D extends A,B { // suppose it is possible
}
现在要使用 C 的对象,您可以doSomething()
在 C 类中实现。仅在 C 类中实现。
但是如果你可以创建一个 D 的对象并调用doSomething
应该调用哪个方法呢?因为此方法在 A 和 B 中都实现了。
钻石问题
实际上真正的钻石问题是
class A {
public void doSomething() {
}
}
class B extends A{
public void doSomething() {
}
}
class C extends A{
public void doSomething() {
}
}
class D extends B,C { // suppose it is possible
// no implementation of doSomething.
}
因其呈菱形而得名钻石。如果您想执行以下操作,请在此处
D d = new D();
d.doSomething(); // which method should be called now????
来自维基百科这里是一个很好的实时示例
例如,在 GUI 软件开发的上下文中,类 Button 可以继承自类 Rectangle(用于外观)和 Clickable(用于功能/输入处理),类 Rectangle 和 Clickable 都继承自 Object 类。现在,如果为 Button 对象调用 equals 方法,而 Button 类中没有这样的方法,但在 Rectangle 和 Clickable 中都有重写的 equals 方法,最终应该调用哪个方法?