Java中抽象类和接口的区别

在复习java的时候遇到了抽象类和接口,很好奇这两个有什么区别,于是去网上搜索了相关的例子,下面给出一个例子来说明这两者之间的区别。

狗都具有eat()和sleep()这两个方法,我们可以用abstract和interface来定义这个抽象概念

 1 //通过抽象类定义
 2   public abstract class Dog {
 3       public abstract void eat();
 4       public abstract void sleep();  
 5   }
 6   
 7   //通过接口定义
 8   public interface Dog {
 9       public abstract void eat();
10       public abstract void sleep();
11   }

我们现在想要狗拥有一个特殊的技术——钻火圈DrillFireCirecle(),如何增加这个行为呢?

假设有两个方法:

  • 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适
  • 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的eat() 、sleep() 方法(重写该接口中所有的方法)显然也不合适
我们可以想一想,eat和sleep这两个方法每一条狗都有这个行为,但是钻火圈却并不是每一条狗都会的,只能说是狗的一种扩展功能,所以我们应该将这个特殊的行为,单独设计成一个接口,其中包含DrillFireCircle()方法,Dog设计为一个抽象类,其中有eat(),sleep()两个方法,因为每条狗都有这个行为

总结:

继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。

原文地址:

https://www.zhihu.com/question/20149818

上一篇:什么是继承?


下一篇:Java多态的初理解