关于java:抽象类之间的差异接口

Difference Interfaces between Abstract Classes

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Interface vs Base class
Interface vs Abstract Class (general OO)
Abstract class vs Interface in Java

所以我在编程课程中学习了接口和抽象类。这两个主题似乎非常相似。我知道两者都与继承有关,但两者有什么区别?


抽象类可以在方法体中包含代码,这在接口中是不允许的。


有两个主要区别。

  • 接口不能包含任何实现。接口只是抽象方法的列表,实现该接口的所有类都必须实现所有这些方法。另一方面,抽象类可以包含一些方法的实现,然后这些方法可以被子类使用。
  • 一个类只能有一个抽象或其他超类,但是一个类可以实现任意数量的接口。

  • 抽象类可以包含方法,而接口不能包含方法。

    我通常这样想:

    • 如果希望类强制其他类编写方法,请使用接口。
    • 如果您希望一个类为多个类保存一个公共方法,请使用一个抽象类。
    • 小精灵

      例如,您可能想要创建一个Animal类。然后有一个DogCat类。猫狗都在睡觉。所以你希望他们都有睡眠方法。它们的睡眠方式基本上是一样的。所以您希望Animal类保持方法(因为对于DogCat是相同的。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public abstract class Animal {
          public void sleep() {
              //make ZZZZ appear in the air or whatever
          }
      }

      public class Dog extends Animal {
          //This class automatically has the sleep method
      }

      public class Cat extends Animal {
          //This class automatically has the sleep method
      }

      另一方面,假设你有一个SnakeShark班。蛇和鲨鱼都会攻击,但攻击方式不同(毒液和咬伤)。所以您可能有一个Attacker接口。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      public interface Attacker {
          //We HAVE to have this here
          public void attack(); //Note - we didn't write the method here, just declared
      }

      public Snake implements Attacker {
          //We HAVE to have this here
          public void attack() {
              //inject venom
          }
      }

      public Shark implements Attacker {
          public void attack() {
              //rip apart
          }
      }

      注意抽象类也可以有未定义的方法(比如接口)。所以你可以把public void makeMeanSound();放在Animal里,然后让Dog咆哮和Cat嘶嘶。主要的区别在于抽象类可以编写实际的方法。

      接口-要编写的强制方法(即强制SnakeShark使用attack()方法)。

      抽象类-为子类提供通用方法。


      接口具有必须由实现它的类定义的方法。

      抽象类类似。但是,在抽象类中,它可以包含继承类自动能够调用的方法定义。

      底线:如果所有实现类的方法定义完全不同,则使用接口。如果继承类共享某些定义,并且对某些方法具有不同的定义,则使用抽象类。

      例子:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      public interface Shape {
          public float getArea();
          public void doThings();
      }

      public class Circle implements Shape{
          public float getArea() {
              return Math.PI * R * R;
          }

          public void doThings() { }
      }

      public abstract class Quadilateral implements Shape {

          public float getArea() { // defined
          return l * h;
          }

          public abstract void doThings(); // left abstract for inheriting classes
      }

      public class Rectangle extends Quadilateral {
          public void doThings() {
          // does things
          }
      }

      public class Parallelogram extends Quadilateral {
          public void doThings() {
          // does things
          }
      }