【问题标题】:Extending a non abstract class and implementing an interface with same method signatures in a class扩展非抽象类并在类中实现具有相同方法签名的接口
【发布时间】:2016-04-11 07:17:25
【问题描述】:

我有以下类和接口

public class A {
  public void printSomething() {
    System.out.println("printing from A");
  }
}

interface B {
  public void printSomething();
}

public class C extends A implements B {
  public static void main(String aa[]) {
    C c = new C();
    c.printSomething();
  }
}

当我编译上面的代码时,它编译没有任何错误。当我运行程序时,它会打印以下内容。

printing from A

我希望编译器会给出类似的错误,例如当我的 C 类 没有扩展 A 类

时遇到的以下错误
 C.java:1: error: C is not abstract and does not override abstract method printSomething() in B public class C implements B{
       ^
C.java:8: error: cannot find symbol
                        c.printSomething();
                         ^
  symbol:   method printSomething()
  location: variable c of type C
2 errors

我知道当一个类实现一个接口时,我们需要在类中定义接口方法或声明类抽象。但是,如何通过扩展一个类(使用具有相同签名的已定义方法)来克服这个编译器警告并运行程序。

【问题讨论】:

  • 这是因为你从超类继承了这个方法。该方法必须提供,并且通过继承,它是
  • 你为什么期待这个?继承意味着C可以被视为A;而A 有那个方法...
  • 实现interface 会强制您访问类中interface 中定义的方法,而不是将其实际写入实现interface 的类中。如果该类确实从已经定义了该方法的类继承并且它可以访问它,则条件已满足,因此您无需再次覆盖该方法。

标签: java inheritance interface


【解决方案1】:

这样做绝对没问题,而且非常普遍。

您将class A 用作实现interface B 指定的interface 的工具。

这种模式有利于模块化和代码重用的潜力。

【讨论】:

  • 所以你的意思是如果我想要一个函数的默认实现,那么我可以使用上面的模式来实现它?并在需要的任何子类中覆盖该函数
  • 当然。 class C 可以提供它自己的 printSomething 实现,如果你想让它做一些不同的事情。
  • 谢谢!!这有帮助
【解决方案2】:

这是因为 C 是 A 的子级。每当 Child 默认契约者被执行时,它的父构造函数就会被调用(这是为了继承 A 的所有属性)。 在这种情况下,“new C()”使 A() 的所有属性都可用于 C 类,包括 printSomething()。

【讨论】:

  • 调用超类的构造函数与此有什么关系?您不会调用该构造函数来“继承所有属性”,而是调用它以确保实例化超类的成员
  • 超类成员被实例化,这意味着一块内存被分配给子元素在需要时可以访问的资源(私有资源除外)。这只不过是间接向其子代开放所有资源。
  • 它是“扩展”关键字,可以访问(非私有)超级成员。
【解决方案3】:

这是因为,通过将class A 扩展为class C,您实际上为interface BprintSomething() 方法提供了实现。

请注意:class A 包含printSomething() 方法的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多