Interface和Abstract类中的方法相同

我来到了这种情况:

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

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

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

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

仅在接口中声明的方法被实现。 Java中存在这种区别以解决多重inheritance的问题。 一个类只能扩展一个父类,因此任何对super调用都将得到解决而不会产生歧义。 但是,类可以实现多个接口,这些接口都可以声明相同的方法。 最好将接口视为“必须拥有”的列表:要符合Comparable你的cluss必须有一个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确保您覆盖没有差异的接口或抽象超类的方法。 因此覆盖没有错误。

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

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

你有一个类名是hello并且exteds抽象类和实现接口是真的你在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. }