具有相同名称的继承方法,它是如何工作的?

时间:2011-12-02 15:06:52

标签: java interface multiple-inheritance

为了好奇心我试过这个:

public interface test1 {
    public Object method1(String str);
}

public interface test2 {
    public Object method1(String str);
}

public class Test implements test1, test2 {    
    public static void main(String... args) {

    }

    public Object method1(String str) {
        return new Object();
    }
}

我在Eclipse的public class Test implements test1, test2 {行遇到了某种错误,但没有。

  1. 为什么没有编译时错误,因为存在冲突 方法名称?
  2. class Test中继承了多少种方法?
  3. 如果上述问题的答案是2,那么究竟是哪种方法 我们实施了吗?
  4. 在运行时,如何正确实现方法 选择?而不是另一个?
  5. 最后,有没有办法实现两者? (我几乎可以肯定答案是否定的)
  6. 我知道从设计的角度来看,这可能不会发生在现实世界的情况中,但正如我在开始时所提到的那样,它只是出现在我脑海中并且我尝试过了。

    非常感谢任何澄清/参考。

3 个答案:

答案 0 :(得分:7)

没有碰撞。两个接口都需要一个名为method1的方法,并且示例类中的method1都满足这两个方法。实现接口时,根本不会继承任何方法;你只是承诺自己实施这些方法。

关于最后一个问题的答案,请参阅现有的SO问题:

Java - Method name collision in interface implementation

有一项建议Java 8允许接口指定一个名为Virtual Extension Methods的默认实现。如果使其成为语言,则两个接口可以为同一方法签名指定不同的默认实现。如果那些接口然后由一个类实现,那么它将必须提供它自己的实现(即它将等同于两个接口都没有指定默认值) - 参见 3.3。违约冲突

答案 1 :(得分:0)

您的接口在方法中没有任何实现,并且它们的签名是相同的。因此,实际上只有该方法的一个版本,它是Test类中的实现。

所以实际上没有任何名称冲突。

答案 2 :(得分:0)

a)即使接口中存在方法名称冲突。实现接口的类应该实现接口的所有方法。在这种情况下,由于您的类满足实现接口的所有条件,因此不会产生任何错误。

该类实现了接口Test1的所有方法以及Test2和eventhough方法名称冲突,实现的编码满足,因此不产生错误。

b)实现接口时没有什么比继承更好的了,你需要做的就是在你的类中实现接口的所有方法,否则它必须被声明为抽象类。