【问题标题】:Same method in Interface and Abstract class接口和抽象类中的相同方法
【发布时间】:2012-07-02 15:34:55
【问题描述】:

我遇到了情况:

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.
    }

}

【问题讨论】:

  • 你正在覆盖两者。有什么问题?

标签: java


【解决方案1】:

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

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

【讨论】:

  • 这里如何使用抽象类实现?
【解决方案2】:

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

在接口中声明的方法只是被实现。 Java中存在这种区别是为了解决多继承问题。一个类只能扩展一个父类,因此对super 的任何调用都将毫无歧义地解决。然而,类可以实现多个接口,它们都可以声明相同的方法。最好将接口视为“必须具有”的列表:要获得Comparable 的资格,您的集群必须具有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
}

【讨论】:

  • 即使我们从接口实现一个方法,我们也会写 @Override
  • 所以?这只是一个注释,可以更容易地找到某种类型的错误,但它不是语言本身的一部分。如果您愿意,您可以在不使用 @Override 注释的情况下覆盖方法。
  • 我想知道为什么我们对只实现而不是覆盖的方法有 Override 而不是 Implement...
【解决方案3】:

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

您有一个名为Derived 的类,它扩展一个abstract implement一个接口。这是真的,你覆盖了 Derived 类的 print 方法,这很好,它可以正确编译并且没有给出任何错误,但是在这里你无法确定哪个类方法被覆盖,如抽象类或接口。

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

interface AnInterface
{
    public void print();
}
abstract class Base
{
    public abstract void print();
}
public class Derived extends Base implements AnInterface
{
    public void print(){
        System.out.println("hello");
    }
        AnInterface iRef = new Derived();
        iRef.print(); // It means interface method is overridden and it's decided when we call the method.
        Base base = new Derived();
        base.print(); // It means abstract class method is overridden.
}

【讨论】:

  • 如果 -> Hello hello = new Hello(); hello.meth1();
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2018-12-15
    • 1970-01-01
    • 2011-10-25
    • 2013-08-14
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多