在复习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() 方法(重写该接口中所有的方法)显然也不合适
总结:
继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。
原文地址:
https://www.zhihu.com/question/20149818