我有一个名为 I 的界面。该接口由抽象类 AClazz 实现。
AClazz implements I
现在这个抽象类由几个具体类扩展。
ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz
现在,当我向接口添加新方法契约时,I为什么 Eclipse 以及 Java 语言抱怨具体类(ConcreteClazz 和 AnotherConcreteClazz)内缺少实现,而不是抽象类 AClazz 内?
如果 AClazz 是一个具体类(而不是抽象)并且从非抽象 AClazz 扩展的具体类,Java 会再次抱怨具体类中缺少实现吗?
所以说你的接口
I
有一个方法m
:
public interface I {
public void m (int someParameter);
}
现在
AClazz
实现了 I
,并且 ConcreteClazz
扩展了 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
的实现,否则这如何工作?
这就是为什么您需要在
m
或 AClazz
中实现 ConcreteClazz
。 如果这是正确的做法,您可以在 AClazz
中实现它,然后您不需要在 ConcreteClazz
中提供另一个实现。 但如果你不在 AClazz
中实现它,它不会导致任何错误,因为在运行时,你实际上不能拥有 AClazz
类型的对象。 但是,由于您可以拥有
ConcreteClazz
类型的对象,这意味着在某个地方,对于ConcreteClazz
,必须有一个m
的实现。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 methods
起,就
must be implemented by the classes that are implementing
他们,除非它被标记为 abstract
。再次遵循上述规则。具体类不能有任何抽象方法,因为您的子类正在扩展您的抽象类,并且该类没有实现接口中新添加的方法,因此编译器会抱怨。因为新添加的抽象方法会在所有子类中继承,而具体类不能有抽象方法。