扩展非抽象类并在类中实现具有相同方法签名的接口

时间:2016-04-11 07:17:26

标签: java inheritance interface

我有以下类和接口

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

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

2 个答案:

答案 0 :(得分:0)

这是因为C是A的子级。每当Child默认承包商被执行时,其父构造函数被调用(这是为了继承A的所有属性)。 在这种情况下,"新的C()"使A()的所有属性都可用于C类,包括printSomething()。

答案 1 :(得分:0)

这是因为,通过将class A扩展为class C,您实际上为printSomething()的{​​{1}}方法提供了实现。

请注意:interface B包含class A方法的实现。