抽象方法在抽象类或接口中定义时,它是如何不同的?

时间:2014-12-11 19:36:00

标签: java interface abstract

假设抽象类只有在其中声明的抽象方法,并且接口具有抽象方法。

这对抽象方法m有何影响?

abstract class A {
    abstract void m();
}

interface A {
    abstract void m();
}

2 个答案:

答案 0 :(得分:3)

即使抽象类是纯抽象,即只包含抽象方法而且不包含状态,您的子类extends也只是这个类,因此您只有单继承。

但是,您可以实现多个接口。

因此,如果要强制类成为A的子类而不是其他类的子类,请使用抽象类。否则定义接口。

答案 1 :(得分:1)

如果您不确切知道所有实体是否需要覆盖特定方法,那么界面也会更有用。比如说鸟类,有些可以飞,有些可以飞。您不希望强制覆盖所有fly()子类中的Bird方法。

public abstract class Bird(){
  ...
  public abstract void eat(); //all birds eat
  public abstract void sleep(); //all birds sleep
  public abstract void fly(); //is wrong here since not all birds can fly
}

更正确的方法是为特定情况定义接口,因此在这种情况下

public interface Flyable{
    abstract void fly();
}

然后,你可以根据他们实现Flyable接口的事实,将你的子类定义为可以飞行的鸟类。

public class Eagle extends Bird implements Flyable{
   @override
   public void fly(); //needed
   -----
}

public class Ostrich extends Bird{
   //does't fly
}