Java 多重继承,将调用哪个方法?

Java 多重继承,将调用哪个方法?,java,Java,在这种情况下,调用哪个接口的方法 interface A{ public abstract void method(); } interface B{ public abstract void method(); } class C implements A,B{ public void method(){} public static void main(String args[]){ C ob=new C();

在这种情况下,调用哪个接口的方法

interface A{
    public abstract void method();    
}

interface B{
    public abstract void method();    
}

class C implements A,B{
    public void method(){}

    public static void main(String args[]){ 
        C ob=new C();
        ob.method();

        System.out.println("");

    }
}
将调用Cs方法

因为它是C的实例


注意:在本例中,接口至少没有实现。接口不提供实现。调用的方法将是在C中声明和实现的方法。

实际上,它与接口包含方法定义无关,而事实是在运行时它将调用类C的方法declarationobj.method。

当您在接口中定义方法时,您不提供方法体。您只定义了一个原型和一个所有实现者都必须遵循的契约。这允许编译器知道,如果一个对象实现了一个接口,那么它必须拥有这些方法。由于您没有在两个接口中创建方法体,因此在类C中只有一个方法

这对于Java1.8来说并不适用,在Java 1.8中,您可以在接口中提供方法的默认实现。现在,您可能有一个类似于您发布的示例的情况,其中您实现了两个具有冲突方法体的接口。我之所以说可以,是因为设计者预见到了这一点,如果不显式重写冲突的默认方法,这将是一个编译器错误

例如:

这是一个类型多重继承的示例,它指的是类C,用于A或B引用。这不是行为/方法的多重继承或状态的多重继承,Java中没有状态的多重继承

所以您需要为该方法提供显式实现,以实现联系人,记住接口是一个协定,并且您的类应该完全实现该协定,因为这里没有方法的继承

但是在Java8中,通过在接口中提供默认实现,可以对行为/方法进行多重继承,因此如果是这种情况,则需要在C类上提供显式实现,并且可以将调用委托给其中一种类型。例如:

public class Main {

    public static interface A {

        default public int get() {
            return 0;
        }

    }

    public static interface B {

        default public int get() {
            return 1;
        }

    }

    public static class C implements A, B {

        public int get() {
            return B.super.get();
        }

    }

    public static void main( String[] args ) throws Throwable {
        System.out.println( new C().get() );
    }
}

现在您可以理解为什么可以实现多个接口,但不能扩展多个类。这里不需要使用abstract关键字。默认情况下,接口方法是公共的,抽象的,由Contracts覆盖,但调用哪个接口的方法?这是什么意思?意味着该方法用于哪个接口的A或B?
public class Main {

    public static interface A {

        default public int get() {
            return 0;
        }

    }

    public static interface B {

        default public int get() {
            return 1;
        }

    }

    public static class C implements A, B {

        public int get() {
            return B.super.get();
        }

    }

    public static void main( String[] args ) throws Throwable {
        System.out.println( new C().get() );
    }
}
// delegate the call to A method implementation, Java 8 
@Override
public void method() { 
   A.super.method() 
}