學習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。