在java中,无论是写代码、面试、交流,均不可或缺的提到一个问题,抽象类和接口的区别
网上可谓众说纷纭,再次不在多说,想知道的请找度娘。
我今天想分享的是在对“子类”/“实现者”的影响角度来分析二者的区别:
抽象类
首先, 我们来从抽象类 的三个字进行分析:
抽象类的主体是 类 ,只不过这个类 是抽象的,
那么,他就具有了应该具备类的全部功能,但他是抽象的,那么他必然可以有一般类不具有的东西——抽象方法。
至于抽象类和类的差别,不是此文章的重点,再次不在细说。
抽象天生就是用来继承(extends)的,他决定了子类/派生类是什么的问题。
如:
/**
*
* 鸟的父类
* 假设鸟只会飞和吃
*
* <br>==========================
* <br> 开发:myhc2014@163.com
* <br> 创建时间:2015年10月16日下午6:45:07
* <br>==========================
*/
public abstract class Brid {
/**
* 飞,子类将要复写该方法,实现自己的飞行方式
*/
public abstract void fly();
/**
* 吃
*/
public void eat() {
}
}
/**
*
* 百灵鸟
*
* <br>==========================
* <br> 开发:myhc2014@163.com
* <br> 创建时间:2015年10月16日下午6:44:40
* <br>==========================
*/
public class Lark extends Brid {
@Override
public void fly() {
// 实现百灵鸟到底是怎么飞的
}
}
我们可以很明确的说,百灵鸟是鸟。
接口
我们来看看,接口是什么?
有人说,接口是对抽象类的抽象,把抽象类中所有类的东西,都抽出去了,剩下的部分就是接口。
我不反对,这的确是一个接口抽象的过程。
但接口能用来干什么呢?
在实际开发中,接口往往用于定义协议或者定义功能
接口是类的一个附加功能,如果一个类实现了某个接口,说明该类具备某种能力;
而并不能说,xx类对象,是某接口的子类(这样说主要是区别于抽象类)。
引用上面的百灵鸟例子。
大家都知道,百灵鸟区别于其他鸟的最大特点应该是唱歌了吧,
我们定义一个唱歌者接口
/**
*
* 唱歌者
*
* <br>==========================
* <br> 公司:奇虎360
* <br> 创建时间:2015年10月16日下午6:37:35
* <br>==========================
*/
public interface IMusicer {
/**
* 唱歌
*/
void sing();
}
由于百灵鸟会唱歌,百灵鸟的类就可以进化一下:
/**
*
* 百灵鸟
*
* <br>==========================
* <br> 公司:奇虎360
* <br> 开发:chenbaolong@360.cn
* <br> 创建时间:2015年10月16日下午6:43:38
* <br>==========================
*/
public class Lark extends Brid implements IMusicer {
@Override
public void sing() {
// 百灵鸟唱歌
}
@Override
public void fly() {
// 实现百灵鸟到底是怎么飞的
}
}
通过上面的代码实例,
通常情况下,我们会说,看到了一个会唱歌的百灵鸟,却不会说一个会飞的歌手。
当然,如果商场有活动,需要一个歌手唱支歌,把一个百灵鸟放上去,也是可以的,因为
他具备歌手的唱歌能力。
总结
通过上面的介绍,不知道您是否知道了抽象类和接口,在对子类影响中的地位。
通过对抽象了和接口的理解,能加深对设计模式的理解,也能对事务的抽象能力。
千言万语汇成一句话:
抽象类的子类一定是抽象类所抽象的对象;接口的实现类一定具备接口所定义的功能。