Java接口合同问题

时间:2014-02-11 15:45:24

标签: java inheritance compiler-construction interface abstract-class

我有一个名为的界面。该接口由抽象类AClazz实现。

AClazz implements I

现在,这个抽象类由几个具体类扩展。

ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz

现在,当我向接口添加新方法契约时为什么eclipse和Java语言会抱怨具体类中缺少实现( ConcreteClazz AnotherConcreteClazz )而不是抽象类AClazz里面?

如果 AClazz 是一个具体的类(并且不是抽象的),并且从非抽象 AClazz 扩展的具体类,Java会抱怨在具体类中再次缺少实现吗?

3 个答案:

答案 0 :(得分:1)

Abstract class means, this class contains abstract methods (i.e. no implementation, only definition of method), the classes that are extending it must implement the unimplemented methods

Interface contains 100% pure public abstract methodsmust be implemented by the classes that are implementing,除非它被标记为abstract。再次遵循上述规则。

答案 1 :(得分:1)

所以说你的界面I有一个方法m

public interface I {
     public void m (int someParameter);
}

现在AClazz实施IConcreteClazz扩展AClazz。这意味着ConcreteClazz也会实现I,无论您是否在class ConcreteClazz声明中明确说明。这意味着您可以在预期ConcreteClazz的任何位置使用I对象。所以说某个地方,在其他一些类中,你有一个方法

void takeSomeAction(Something x, I y) {
    ....
    y.m (x.getSomeProperty());  // call the interface method
    ....
}

您可以使用ConcreteClazz对象调用它:

ConcreteClazz z = new ConcreteClazz(...);
Something st;

foo.takeSomeAction(st, z);

您将takeSomeAction ConcreteClazz作为其I参数使用。然后takeSomeAction会调用m方法。除非你在某个地方为m提供了实现,否则这怎么办?

这就是您需要在mAClazz中实施ConcreteClazz的原因。您可以AClazz中实现它,如果这是正确的事情,那么您不需要在ConcreteClazz中提供其他实现。但是如果你没有在AClazz中实现它,它就不会导致任何错误,因为在运行时,你实际上不能拥有AClazz类型的对象。但是,由于可以具有ConcreteClazz类型的对象,这意味着在ConcreteClazz的某处,必须有m的实现。

答案 2 :(得分:0)

无论添加多少新的抽象方法,抽象类都保持抽象。因此,当您在I接口中添加一个由抽象类实现的新方法时,编译器不会抱怨。

具体类不能有任何抽象方法,因为您的子类正在扩展您的抽象类,并且该类没有为接口实现新添加的方法,因此编译器会抱怨。因为新添加的抽象方法在所有子类中继承,并且具体类不能具有抽象方法。