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

Java 扩展非抽象类并在类中实现具有相同方法签名的接口,java,inheritance,interface,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 = n

我有以下类和接口

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的所有属性)。
在本例中,“new C()”使类C可以使用A()的所有属性,包括printSomething()


您正在使用
A类
作为实现
接口
指定的
接口
的工具


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

这是因为,通过将
类A
扩展到
类C
,实际上为
接口B
printSomething()
方法提供了实现


请注意:
类A
printSomething()
方法的实现组成。

这是因为您从超类继承了此方法。必须提供方法,而且,通过继承,这就是为什么您希望这样?继承意味着
C
可以被视为
a
;而
A
具有该方法…实现
接口
会强制您访问类中
接口
中定义的方法,而不是将其实际写入实现
接口的类中。如果该类确实继承了一个已经定义了该方法的类,并且它可以访问该类,那么条件将被完全填充,因此您不需要再次覆盖该方法。调用超类的构造函数与此有什么关系?调用该构造函数不是为了“继承所有属性”,而是为了确保超级类的成员被实例化超级类成员被实例化,这意味着一块内存被分配给子元素在需要时可以访问的资源(私有资源除外)。这只是间接地将所有资源开放给其子级。是“extends”关键字提供了对(非私有)超级成员的访问权限。那么你的意思是,如果我想要函数的默认实现,那么我可以使用上述模式实现吗?并在需要时重写任何子类中的函数<代码>C类
可以提供自己的
printSomething
实现,如果您希望它做一些不同的事情。谢谢!!那有帮助