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

时间:2014-08-20 05:32:38

标签: 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();
        ob.method();

        System.out.println("");

    }
}

在这种情况下,方法()被调用哪个接口。

5 个答案:

答案 0 :(得分:1)

 C obj = new C();
将调用

C方法

因为它是C的实例

注意:界面没有实现(至少在本例中)

答案 1 :(得分:1)

都不是。接口不提供实现。调用的方法将在C中声明和实现。

答案 2 :(得分:1)

实际上这无关紧要(接口包含方法定义)事实是运行时它会调用class C' s method声明(obj.method())。

答案 3 :(得分:0)

在界面中定义方法时,您不提供方法体。您只需定义所有实施者必须遵循的原型和合同。这允许编译器知道如果Object实现接口,它必须具有这些方法。由于您没有在两个接口中创建方法体,因此只有一个方法可以在C类中找到。

对于Java 1.8,这不适用于您可以在接口中提供方法的默认实现。现在,您可以在已发布的示例中使用类似的案例,其中实现了两个具有冲突方法体的接口。我说可以,因为设计师预见到这一点,如果你没有明确地覆盖冲突的默认方法,这是一个编译器错误。

示例:

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() );
    }
}

答案 4 :(得分:0)

这是类型的多重继承的一个例子,它意味着你的类C和用于A或B引用。(这不是行为/方法的多重继承或状态的多重继承),有Java中没有状态的多重继承

所以你需要提供这个方法的显式实现来实现联系,记住接口是一个契约,你的类应该实现那个完全合同(这里没有方法的继承)。 / p>

但是在Java 8中,您可以通过在接口中提供默认实现来行为/方法的多重继承,因此,如果是这种情况,则需要提供明确的在C类上实现,您可以将调用委托给其中一种类型。例如:

// delegate the call to A method implementation, Java 8 
@Override
public void method() { 
   A.super.method() 
}