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

Java 为什么一个类可以实现多个接口,但不能继承多个类?,java,inheritance,interface,Java,Inheritance,Interface,我发现的答案之一是“如果属于两个不同类的两个方法/变量具有相同的名称,则多重继承可能导致冲突”。但是我认为在实现多个接口时也会有冲突。对于EG,考虑一个类实现两个具有相同变量名的接口(变量可以在接口中定义,它们默认是最终的)。 interface Ainterface { public final static int i=10; } class InterfaceCheck implements Ainterface { public static void m

我发现的答案之一是“如果属于两个不同类的两个方法/变量具有相同的名称,则多重继承可能导致冲突”。但是我认为在实现多个接口时也会有冲突。对于EG,考虑一个类实现两个具有相同变量名的接口(变量可以在接口中定义,它们默认是最终的)。
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);
    }

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

变量可以在接口中定义,默认情况下为最终变量

*Java接口中的变量默认为公共静态最终。这是因为接口并不意味着指示实现,而只是指示行为。这意味着接口中的变量实际上是常量

静态变量不会被继承。因此,不存在冲突的可能性

变量可以在接口中定义,默认情况下为最终变量

*Java接口中的变量默认为公共静态最终。这是因为接口并不意味着指示实现,而只是指示行为。这意味着接口中的变量实际上是常量


静态变量不会被继承。因此不存在冲突的可能性。

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

它将从两个接口实现对象。因此,如果两个接口都有相同的变量,它将作为单个变量实现这两个接口。方法也是如此。

由于菱形问题,类中不允许多重继承。简单的答案是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.
}
但是,必须定义默认方法,如果您正在实现这两个接口,则必须定义默认方法,否则会产生前面提到的编译错误。现在棘手的部分是,常用的默认方法是使用 IA.super.abc()


由于菱形问题,类中不允许多重继承。简单的答案是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.
}
但是,必须定义默认方法,如果您正在实现这两个接口,则必须定义默认方法,否则会产生前面提到的编译错误。现在棘手的部分是,常用的默认方法是使用 IA.super.abc()


当同一个基类通过不同的继承链被多次继承时,事情就变得复杂了。这是Java设计者不想涉足的领域。因此,限制只继承一个类。多重继承最有趣的应用程序可以从接口中获得。@chirag正如我在发布的答案中提到的,定义的方法或字段将显示冲突。由于字段是静态的,您可以安全地在println()中使用Ainterface.i或Binterface.i。如果它是一个函数接口的默认方法,它将在多重继承接口时显示编译错误,并且不允许两个接口被多重继承。@ChiragJain很好,你正在分析所有的细节,我记得我在读Khalid的java时也这么想。即使在这里,如果不使用InterfaceName.i访问公共字段,也会出现编译错误!如果您不访问不明确的字段,那么在编译和运行时就可以了。如果您喜欢ans,请向上投票。当您使用外部内部类时,同样的问题也会出现。是的,正如您所期望的,这个示例会出现错误。确实存在冲突。但毫无疑问。你的问题是什么?@Nitish我无法提升声望。当同一个基类通过不同的继承链被多次继承时,事情会变得复杂。这是Java设计者不想涉足的领域。因此,限制只继承一个类。多重继承最有趣的应用程序可以从接口中获得。@chirag正如我在发布的答案中提到的,定义的方法或字段将显示冲突。由于字段是静态的,您可以安全地在println()中使用Ainterface.i或Binterface.i。如果它是函数接口的默认方法,则在多重继承接口时会显示编译错误,并且不允许两个接口被多重继承。@ChiragJain很好,你是