为什么一个类可以实现多个接口但不能继承多个类?

时间:2017-07-02 05:20:55

标签: java inheritance interface

我发现的答案之一是“如果属于两个不同类的两个方法/变量具有相同的名称,则多重继承会导致冲突”。但我认为在实现多个接口时也可能存在冲突。例如,考虑一个实现两个具有相同变量名的接口的类(变量可以在接口中定义,默认情况下它们是最终的)在其中声明

interface Ainterface {

    public final static int i=10;

}


class InterfaceCheck implements Ainterface {
        public static void main(String[] args) {        
        System.out.println(i);
    }

}

以上代码完美无缺

interface Ainterface {

    public final static int i=10;

}

interface Binterface {

    public static final int i=20;

}

class InterfaceCheck implements Ainterface,Binterface {
        public static void main(String[] args) {        
        System.out.println(i);
    }

}

根据互联网上的消息来源“实施多个接口永远不会导致冲突” 但上面的代码会产生错误。所以这就是我所说的冲突。

3 个答案:

答案 0 :(得分:6)

  

变量可以在界面中定义,默认情况下它们是最终的

*默认情况下,Java界面中的变量为 public static final 。这是因为接口并不是指示实现,而是指示行为。这意味着接口中的变量实际上是常量。

不继承静态变量。所以不存在冲突的可能性。

答案 1 :(得分:0)

它将从两个接口实现对象。因此,如果两个接口都具有相同的变量,那么它将作为单个变量实现。同样适用于方法。

答案 2 :(得分:0)

由于钻石问题,不允许在类中进行多重继承。简单的回答是super.commonMethodInBothClasses()如何工作? jvm如何知道在super.method调用中在子类中使用哪个方法定义?这导致歧义。在java8中,您可能会发现一个惊喜,我们可以在接口中定义方法,称为默认方法。但是在接口(功能接口)中仍然允许多重继承,但是在编译时检查接口在接口中是否有定义时必须没有共同的方法。如果声明了两个方法但没有使用相同的签名定义,则允许这样做,因为两个接口中没有的定义之间存在冲突。

Interface1{
  public static final int a= 10;
default void method1(){
// definition
}
void method2DeclaredOnly();
}

Interface2{
 public static final int a = 20;
default void method3(){
// definition
}
void method2DeclaredOnly();
}

class MyClass implements Interface2, Interface1{

void method2DeclaredOnly(){
System.out.println(Interface1.a); // static members can be referred. directly. Classname.field 
// defined here allowed.
}

但是,必须定义默认方法,如果有的话,你要实现两个接口,否则它会像前面提到的那样给出编译错误。现在这里棘手的部分是,使用常见的默认方法 1A中的名为.abc();

    interface IA{
        default void abc(){
            //..
        }
    }

    interface IB{
default void abc(){
            //..
        }
    }

    class A implements IA, IB
    {
        public void abc(){
            IA.super.abc(); //..

                }
    }