繁体   English   中英

哪个方法将被接口或类覆盖?

[英]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()方法是否在声明为DemoDemo1practice对象上调用也无关,方法签名以任何一种方式实现。

事实上,您甚至可以删除您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM