當前位置:編程學習大全網 - 編程語言 - java中的抽象類和接口該怎麽理解 ?定義上有什麽區別?通常分別有什麽作用?

java中的抽象類和接口該怎麽理解 ?定義上有什麽區別?通常分別有什麽作用?

在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是並不是所有的類都是用來描繪對象的,如果壹個類中沒有包含足夠的信息來描繪壹個具體的對象,這樣的類就是抽象類。

抽象類往往用來表征我們在對問題領域進行分析、 設計中得出的抽象概念,是對壹系列看上去不同,但是本質上相同的具體概念的抽象,我們不能把它們實例化(拿不出壹個具體的東西)所以稱之為抽象。

比如:我們要描述“水果”,它就是壹個抽象,它有質量、體積等壹些***性(水果有質量),但又缺乏特性(蘋果、橘子都是水果,它們有自己的特性),我們拿不出唯壹壹種能代表水果的東西(因為蘋果、橘子都不能代表水果),可用抽象類來描述它,所以抽象類是不能夠實例化的。當我們用某個類來具體描述“蘋果”時,這個類就可以繼承描述“水果”的抽象類,我們都知道“蘋果”是壹種“水果”。

在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出壹個固定的壹組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這壹組任意個可能的具體實現則表現為這個抽象類的所有派生類。

接口和抽象類中的所有抽象方法不能有具體實現,而應在它們的子類中實現所有的抽象方法(要有函數體,哪怕{ }裏是空的),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 (){

…… //抽象類中可以賦予非抽象方法方法的默認行為,即方法的具體實現

 }

public void method3(){

…… //抽象類中可以賦予非抽象方法方法的默認行為,即方法的具體實現

 }

}

接口(interface)的定義方式如下:

public interface Interface

{

 static final int i; //接口中不能有普通數據成員,只能夠有靜態的不能被修改的數據成員,static表示全局,final表示不可修改,可以不用static final 修飾,會隱式的聲明為static和final

 

public void method1(); //接口中的方法壹定是抽象方法,所以不用abstract修飾

 

 public void method2(); //接口中不能賦予方法的默認行為,即不能有方法的具體實現

}

簡言之抽象類是壹種功能不全的類,接口只是壹個抽象方法聲明和靜態不能被修改的數據的集合,兩者都不能被實例化。

從某種意義上說,接口是壹種特殊形式的抽象類,在java語言中抽象類表示的是壹種繼承關系,壹個類只能繼承繼承壹個抽象類,而壹個類卻可以實現多個接口。在許多情況下,接口確實可以代替抽象類,如果妳不需要刻意表達屬性上的繼承的話。

進壹步理解,關於java引入抽象類、接口的目的,向高手請教得到的答復如下:

1、從類的層次結構上看,抽象類是在層次的頂端,但在實際的設計當中,壹般來說抽象類應當是後面才會出現。為什麽?實際上抽象類的獲取有點像數學中的提取公因式:ax+bx,x就是抽象類,如果妳沒有前面的式子,妳怎麽知道x是不是公因式呢?在這點上,也符合人們認識世界的過程,先具體後抽象。因此在設計過程中如果妳得到大量的具體概念並從當中找到其***性時,這個***性的集合就是抽象類應當是沒錯的。

2、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的用法),呵呵。

JAVA中的接口和抽象類

  • 上一篇:電腦剛開機沒多久就死機是什麽原因?!
  • 下一篇:計算機等級考試二級哪個比較好考過
  • copyright 2024編程學習大全網