2012-07-02 33 views
15

我来的情况:相同方法

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

} 
+5

你压倒了两者。有什么问题? –

回答

24

您满足同时两个条件;即。一个实现同时满足抽象类需求和接口需求。

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

5

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

接口中声明的方法只是实现。 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 
} 
+0

即使在从接口实施方法的情况下,也写@Override

+2

那么?这只是一个注释,它使查找某种类型的错误更容易,但它不属于这种语言的一部分。如果你愿意,你可以重写方法而不用'@ Override'注解。 – biziclop

+0

我不知道为什么我们有覆盖,而不是执行的方法,只是实施,而不是重写... – Trejkaz

0

@覆盖,确保您覆盖与无差异接口或抽象超类中的方法。所以没有覆盖错误。

从另一方面接口方法也在超级类中实现,这对于接口契约是足够的。

0

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

你有一个类名是hello,exteds抽象类和实现接口它的真,你覆盖甲方法上hello类它的罚款和它的编译正确,没有给出任何错误,但她不能确定哪个类方法是重写像抽象类或接口。

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

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