Java 接口合约问题

问题描述 投票:0回答:3

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

AClazz implements I

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

ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz

现在,当我向接口添加新方法契约时,I为什么 Eclipse 以及 Java 语言抱怨具体类(ConcreteClazzAnotherConcreteClazz)内缺少实现,而不是抽象类 AClazz 内?

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

java inheritance interface abstract-class
3个回答
1
投票

所以说你的接口

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
的实现。
    


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
。再次遵循上述规则。
    


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.