20

我来到了情况:

public interface Intr {
    public void m1();
}

public abstract class Abs {
    public void m1() {
        System.out.println("Abs.m1()");
    }
    // public abstract void m1();
}

public class A extends Abs implements Intr {

    @Override
    public void m1() {
        // which method am I overriding, well it is Abs.m1() but why?
        // if method implemented is Abs.m1(), then why I am not getting error for Intr.m1() not implemented.
    }

}
4

4 回答 4

26

你同时满足这两个条件;IE。一种实现同时满足抽象类要求和接口要求。

请注意,除非您Intr在另一个继承链中使用它,否则您不需要它。implements Intr此外,向上移动到抽象类定义可能是有意义的。

于 2012-07-02T15:37:41.320 回答
5

您只能覆盖在另一个类中定义的方法。

在接口中声明的方法只是被实现。Java中存在这种区别是为了解决多继承问题。一个类只能扩展一个父类,因此任何对的调用都super将毫无歧义地解决。然而,类可以实现多个接口,它们都可以声明相同的方法。最好将接口视为“必须具有”的列表:要符合资格,Comparable您的 clus 必须有一个compareTo()方法,但它来自哪里或其他接口需要相同的方法并不重要。

因此,从技术上讲,您可以一举覆盖Abs.m1()并实施。Intr.m1()

请注意,这也可以:

public class B extends Abs implements Intr {

    //m1() is inherited from Abs, so there's no need to override it to satisfy the interface
}
于 2012-07-02T15:38:54.897 回答
1

这里接口和抽象类都有相同的方法。

你有一个类名是 hello 和 exteds 抽象类并实现接口它的 true 并且你在 hello 类上覆盖 meth1 方法它很好并且它编译正确并且没有给出任何错误但是你无法识别哪个类方法被覆盖像抽象类或界面。

这是运行时多态性,你不能创建抽象类和接口的对象,但你可以创建它的引用变量。这里的解决方案是您无法在编译时识别出它在运行时的实际覆盖。

interface hi
{
    public void meth1();
}
abstract class Hullo
{
    public abstract void meth1();
}
public class Hello extends Hullo implements hi
{
    public void meth1(){
        System.out.println("hello");
    }
        hi h= new Hello();
        h.meth1();//its means interface method is override. and its decide when we call method.
        hullo hu= new Hello();
        hu.meth1();//its means abstract class method is override.
}
于 2015-06-11T11:46:15.317 回答
0

@Override确保您覆盖没有区别接口或抽象超类的方法。所以覆盖没有错误。

另一方面,接口方法也在超类中实现,这对于接口合同来说已经足够了。

于 2012-07-02T15:39:42.593 回答