学习Java那么久了,java为何要引入接口,接口的做用是什么?接口(interface)是C语言没有的,这样设计有什么好处?抽象类和接口的区别是什么?为何要用抽象类呢?
html
接口的最主要的做用是达到统一访问。
下面是网上找到的一篇文章(粘贴上来,我怕原文件被删除,同时也方便查看)java
在面向对象的概念中,咱们知道全部的对象都是经过类来描绘的,可是并非全部的类都是用来描绘对象的,若是一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类每每用来表征咱们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不一样,可是本质上相同的具体概念的抽象,咱们不能把它们实例化(拿不出一个具体的东西)因此称之为抽象。
好比:咱们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺少特性(苹果、橘子都是水果,它们有本身的特性),咱们拿不出惟一一种能表明水果的东西(由于苹果、橘子都不能表明水果),可用抽象类来描述它,因此抽象类是不可以实例化的。当咱们用某个类来具体描述“苹果”时,这个类就能够继承描述“水果”的抽象类,咱们都知道“苹果”是一种“水果”。ide
在面向对象领域,抽象类主要用来进行类型隐藏。咱们能够构造出一个固定的一组行为的抽象描述,可是这组行为却可以有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为这个抽象类的全部派生类。函数
接口和抽象类中的全部抽象方法不能有具体实现,而应在它们的子类中实现全部的抽象方法(要有函数体,哪怕{ }里是空的),java的设计者可能为抽象方法的灵活性考虑,每一个子类可根据本身的须要来实现抽象方法。学习
抽象类(abstract class)的定义方式以下:
public abstract class AbstractClass //里面至少有一个抽象方法
{
public int t; //普通数据成员
public abstract void method1(); //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
public abstract void method2();
public void method3(); //非抽象方法
public int method4();
publi int method4 (){
…… //抽象类中能够赋予非抽象方法方法的默认行为,即方法的具体实现
}spa
public void method3(){
…… //抽象类中能够赋予非抽象方法方法的默认行为,即方法的具体实现
} 设计
} htm
接口(interface)的定义方式以下:
public interface Interface
{
static final int i; //接口中不能有普通数据成员,只可以有静态的不能被修改的数据成员,static表示全局,final表示不可修改,能够不用static final 修饰,会隐式的声明为static和final
对象
public void method1(); //接口中的方法必定是抽象方法,因此不用abstract修饰
blog
public void method2(); //接口中不能赋予方法的默认行为,即不能有方法的具体实现
}
简言之抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,二者都不能被实例化。
从某种意义上说,接口是一种特殊形式的抽象类,在java语言中抽象类表示的是一种继承关系,一个类只能继承继承一个抽象类,而一个类却能够实现多个接口。在许多状况下,接口确实能够代替抽象类,若是你不须要刻意表达属性上的继承的话。
进一步理解,关于java引入抽象类、接口的目的,向高手请教获得的答复以下:
一、从类的层次结构上看,抽象类是在层次的顶端,但在实际的设计当中,通常来讲抽象类应当是后面才会出现。为何?实际上抽象类的获取有点像数学中的提取公因式:ax+bx,x就是抽象类,若是你没有前面的式子,你怎么知道x是否是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。所以在设计过程当中若是你获得大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
二、interface从表面上看,和抽象类很类似,但用法彻底不一样。它的基本功能就是把一些绝不相关的类(概念)集合在一块儿造成一个新的、可集中操做的“新类”。我给学生的一个典型例子就是“司机”。谁能够当司机?谁均可以,只要领取了驾照。因此我无论你是学生,白领、蓝领仍是老板,只要有驾照就是司机。
interface DriverLicence {
Licence getLicence();
}
class StudentDriver extends Student implements DriverLicence {
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence {
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence {
}
class BossDriver extends Boss implements Driver {
}
当我定义了“汽车”类后,我就能够指定“司机”了。
class Car {
setDriver(DriverLicence driver);
}
这时候,Car的对象并不关心这个司机究竟是干什么的,他们的惟一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类没法比拟的。
总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。一般咱们平时养成良好的习惯就是多用接口,毕竟java是单继承,不像C++,可是在须要使用抽象类的时候必定仍是要用的(有点相似goto的用法),呵呵。
原网址:http://www.cnblogs.com/xiaoao808/archive/2008/03/11/1100886.html。