有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承Java接口契约问题

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

AClazz implements I

现在这个抽象类被几个具体的类扩展了

ConcreteClazz extends AClazz
AnotherConcreteClazz extends AClazz

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

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


共 (3) 个答案

  1. # 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. # 2 楼答案

    假设您的接口I有一个方法m

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

    现在AClazz实现了I,并且ConcreteClazz扩展了AClazz。这意味着ConcreteClazz也实现了I,不管您在ConcreteClazzclass声明中是否明确这么说。这意味着您可以在任何需要I的地方使用ConcreteClazz对象。比如说,在别的课堂上,你有一个方法

    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提供了一个实现,否则这是如何工作的

    这就是为什么您需要在AClazzConcreteClazz中实现m。如果这样做是正确的,那么可以AClazz中实现它,然后不需要在ConcreteClazz中提供另一个实现。但是如果您不在AClazz中实现它,它不会导致任何错误,因为在运行时,您实际上不能拥有类型为AClazz的对象。但是,由于可以拥有类型为ConcreteClazz的对象,这意味着在某个地方,对于ConcreteClazz,必须有一个m的实现

  3. # 3 楼答案

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

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