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
实现,如果您希望它做一些不同的事情。谢谢!!那有帮助