从对子类影响角度分析抽象类和接口的区别
2015-09-29 15:37
344 查看
在java中,无论是写代码、面试、交流,均不可或缺的提到一个问题,抽象类和接口的区别
网上可谓众说纷纭,再次不在多说,想知道的请找度娘。
我今天想分享的是在对“子类”/“实现者”的影响角度来分析二者的区别:
抽象类的主体是 类 ,只不过这个类 是抽象的,
那么,他就具有了应该具备类的全部功能,但他是抽象的,那么他必然可以有一般类不具有的东西——抽象方法。
至于抽象类和类的差别,不是此文章的重点,再次不在细说。
抽象天生就是用来继承(extends)的,他决定了子类/派生类是什么的问题。
如:
我们可以很明确的说,百灵鸟是鸟。
有人说,接口是对抽象类的抽象,把抽象类中所有类的东西,都抽出去了,剩下的部分就是接口。
我不反对,这的确是一个接口抽象的过程。
但接口能用来干什么呢?
在实际开发中,接口往往用于定义协议或者定义功能
接口是类的一个附加功能,如果一个类实现了某个接口,说明该类具备某种能力;
而并不能说,xx类对象,是某接口的子类(这样说主要是区别于抽象类)。
引用上面的百灵鸟例子。
大家都知道,百灵鸟区别于其他鸟的最大特点应该是唱歌了吧,
我们定义一个唱歌者接口
由于百灵鸟会唱歌,百灵鸟的类就可以进化一下:
通过上面的代码实例,
通常情况下,我们会说,看到了一个会唱歌的百灵鸟,却不会说一个会飞的歌手。
当然,如果商场有活动,需要一个歌手唱支歌,把一个百灵鸟放上去,也是可以的,因为
他具备歌手的唱歌能力。
通过对抽象了和接口的理解,能加深对设计模式的理解,也能对事务的抽象能力。
千言万语汇成一句话:
抽象类的子类一定是抽象类所抽象的对象;接口的实现类一定具备接口所定义的功能。
网上可谓众说纷纭,再次不在多说,想知道的请找度娘。
我今天想分享的是在对“子类”/“实现者”的影响角度来分析二者的区别:
抽象类
首先, 我们来从抽象类 的三个字进行分析:抽象类的主体是 类 ,只不过这个类 是抽象的,
那么,他就具有了应该具备类的全部功能,但他是抽象的,那么他必然可以有一般类不具有的东西——抽象方法。
至于抽象类和类的差别,不是此文章的重点,再次不在细说。
抽象天生就是用来继承(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() { // 实现百灵鸟到底是怎么飞的 } }
通过上面的代码实例,
通常情况下,我们会说,看到了一个会唱歌的百灵鸟,却不会说一个会飞的歌手。
当然,如果商场有活动,需要一个歌手唱支歌,把一个百灵鸟放上去,也是可以的,因为
他具备歌手的唱歌能力。
总结
通过上面的介绍,不知道您是否知道了抽象类和接口,在对子类影响中的地位。通过对抽象了和接口的理解,能加深对设计模式的理解,也能对事务的抽象能力。
千言万语汇成一句话:
抽象类的子类一定是抽象类所抽象的对象;接口的实现类一定具备接口所定义的功能。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统