Java 当抽象方法在抽象类或接口中定义时,它有什么区别?

Java 当抽象方法在抽象类或接口中定义时,它有什么区别?,java,interface,abstract,Java,Interface,Abstract,假设抽象类中只声明了抽象方法,而接口中有抽象方法 这如何影响抽象方法m abstract class A { abstract void m(); } interface A { abstract void m(); } 即使抽象类是纯抽象类,即只包含抽象方法而不包含状态,您的子类也扩展了该类,因此您只有一个继承 但是,您可以实现多个接口 因此,如果您想强制类成为a的子类而不是其他类的子类,请使用抽象类。否则定义接口 即使抽象类是纯抽象类,即只包含抽象方法而不包含state,

假设抽象类中只声明了抽象方法,而接口中有抽象方法

这如何影响抽象方法
m

abstract class A {
    abstract void m();
}

interface A {
    abstract void m();
}

即使抽象类是纯抽象类,即只包含抽象方法而不包含状态,您的子类
也扩展了该类,因此您只有一个继承

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


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

即使抽象类是纯抽象类,即只包含抽象方法而不包含state,您的子类
也扩展了该类,因此您只有一个继承

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


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

当您不知道是否所有实体都需要重写特定方法时,接口也更有用。比如说鸟,有些可以飞,有些不能飞。您不想强制重写所有
Bird
子类中的
fly()
方法

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
}

当您不知道是否所有实体都需要重写特定方法时,接口也更有用。比如说鸟,有些可以飞,有些不能飞。您不想强制重写所有
Bird
子类中的
fly()
方法

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
}

这里没有区别,但是当您想要添加其他东西时会有区别。在您的示例中,第一个显著的区别是
m
方法在
class A
中的可见性,它是包私有的,与接口中的接口不同,接口是
public
。这个问题不是关于接口和抽象类之间的区别。@Jeroenvanevel您是如何理解的?问题是“抽象类和接口之间的区别是什么……”@DavidWallace:“…对于这样的场景”,它指的是一个抽象类和一个接口,两者都定义了一个抽象方法。在我看来,问题在于这种抽象方法在这两种情况下有何区别。这里没有区别,但当你想添加其他东西时会有区别。在你的例子中,第一个显著的区别是
class A
m
方法的可见性,它是包私有的,与接口中的接口不同,接口是
public
。这个问题不是关于接口和抽象类之间的区别。@Jeroenvanevel您是如何理解的?问题是“抽象类和接口之间的区别是什么……”@DavidWallace:“…对于这样的场景”,它指的是一个抽象类和一个接口,两者都定义了一个抽象方法。在我看来,问题在于这种抽象方法在两种情况下有什么不同。