![](/img/trans.png)
[英]Java Class cannot override method in abstract class which has a method signature that contains an interface
[英]Which Method will get override from interface or class?
在下面的程序中,我扩展了 Demo1 类并实现了 Demo 接口,在实践类中,我覆盖了在类和接口中声明的public void demo()
,然后该方法将从哪个方法中获得覆盖? 为什么?
interface Demo{
void demo();
}
class Demo1{
int i=10;
public void demo() {
System.out.println("this is demo"+i);
}
}
public class practice extends Demo1 implements Demo {
public static void Main(String[] args ) {
practice p=new practice();
p.demo();
}
public void demo() {
System.out.println("This is Overrided method");
}
}
简短的回答是没关系。 编译器正在寻找的是抽象接口方法的签名是在您的类中实现的,还是从超类型继承的(并且它不关心该继承的签名是否旨在实现有问题的抽象方法)。
并且您的demo()
方法是否在声明为Demo
或Demo1
的practice
对象上调用也无关,方法签名以任何一种方式实现。
事实上,您甚至可以删除您的demo()
覆盖(假设您不需要更改行为),并且代码仍会编译:
class practice extends Demo1 implements Demo {
public static void Main(String[] args) {
practice p = new practice();
p.demo();
}
}
也就是说,即使Demo1.demo()
与Demo.demo()
无关,但实际上practice
继承了与Demo1.demo()
具有相同签名的Demo.demo()
并且不违反访问和异常约束,这使得practice
成为Demo
的有效实现。
来自接口的方法没有被覆盖,它被实现了。
你的练习类继承了Demo1类的demo方法,如果你在练习类本身中省略了demo方法的实现,这个方法将用于实现Demo接口方法。
由于您在实践类本身中实现了演示方法 - 该方法覆盖了Demo1类中的方法,并且还实现了Demo接口中的方法
如果你运行下面的代码
public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
practice p=new practice();
p.demo();
}
public void demo() {
System.out.println("This is Overrided method");
}
}
输出将是“这是覆盖方法”,如果您对演示方法进行评论,如下所示
public class practice extends Demo1 implements Demo {
public static void main(String[] args ) {
practice p=new practice();
p.demo();
}
/*public void demo() {
System.out.println("This is Overrided method");
}*/
}
输出将是“这是demo10”。 在第一种情况下,当类对象在 self 中找到 demo 的定义时,它将优先于父类。
Demo1 提供了 demo() 的实现。 所以它将采用父 demo() 方法。 输出将是
这是demo10
但是随后您在子类实践中再次实现了覆盖 demo() 方法
所以现在输出
这是重载方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.