继承Java接口契约问题
我有一个名为I的接口。此接口由抽象类AClazz实现
AClazz implements I
现在这个抽象类被几个具体的类扩展了
ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz
现在,当我向接口I添加一个新的方法契约时,为什么eclipse和Java语言会抱怨具体类(ConcreteClazz和AnotherConcreteClazz)中缺少实现,而不是抽象类AClazz中缺少实现
如果AClazz是一个具体类(&;非抽象类),并且具体类从非抽象的AClazz扩展而来,Java会再次抱怨具体类中缺少实现吗
# 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 methods
,它must be implemented by the classes that are implementing
会标记它们,除非它被标记为abstract
。再次遵循上述规则# 2 楼答案
假设您的接口
I
有一个方法m
:现在
AClazz
实现了I
,并且ConcreteClazz
扩展了AClazz
。这意味着ConcreteClazz
也实现了I
,不管您在ConcreteClazz
的class
声明中是否明确这么说。这意味着您可以在任何需要I
的地方使用ConcreteClazz
对象。比如说,在别的课堂上,你有一个方法您可以使用
ConcreteClazz
对象调用它:您正在给
takeSomeAction
一个ConcreteClazz
用作它的I
参数。然后takeSomeAction
将调用m
方法。除非您在某个地方为m
提供了一个实现,否则这是如何工作的这就是为什么您需要在
AClazz
或ConcreteClazz
中实现m
。如果这样做是正确的,那么可以在AClazz
中实现它,然后不需要在ConcreteClazz
中提供另一个实现。但是如果您不在AClazz
中实现它,它不会导致任何错误,因为在运行时,您实际上不能拥有类型为AClazz
的对象。但是,由于可以拥有类型为ConcreteClazz
的对象,这意味着在某个地方,对于ConcreteClazz
,必须有一个m
的实现# 3 楼答案
无论向抽象类添加多少新的抽象方法,抽象类都保持抽象。所以,当您在抽象类实现的I接口中添加新方法时,编译器不会抱怨
具体类不能有任何抽象方法,因为您的子类正在扩展抽象类,而该类没有实现接口中新添加的方法,因此编译器会抱怨。因为新添加的抽象方法是在所有子类中继承的,而具体类不能有抽象方法