java中的抽象類和介面該怎麼理解?定義上有什麼區

2021-03-04 05:07:40 字數 4828 閱讀 3431

1樓:匿名使用者

在物件導向的概念中,我們知道

所有的物件都是通過類來描繪的,但是並不是所有的類都是用來描繪物件的,如果乙個類中沒有包含足夠的資訊來描繪乙個具體的物件,這樣的類就是抽象類。

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

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

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

介面和抽象類中的所有抽象方法不能有具體實現,而應在它們的子類中實現所有的抽象方法(要有函式體,哪怕裡是空的),java的設計者可能為抽象方法的靈活性考慮,每個子類可根據自己的需要來實現抽象方法。

抽象類(abstract class)的定義方式如下:

public abstract class abstractclass //裡面至少有乙個抽象方法

public void method3()

} 介面(inte***ce)的定義方式如下:

public inte***ce inte***ce

簡言之抽象類是一種功能不全的類,介面只是乙個抽象方法宣告和靜態不能被修改的資料的集合,兩者都不能被例項化。

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

進一步理解,關於java引入抽象類、介面的目的,向高手請教得到的答覆如下:

1、從類的層次結構上看,抽象類是在層次的頂端,但在實際的設計當中,一般來說抽象類應當是後面才會出現。為什麼?實際上抽象類的獲取有點像數學中的提取公因式:

ax+bx,x就是抽象類,如果你沒有前面的式子,你怎麼知道x是不是公因式呢?在這點上,也符合人們認識世界的過程,先具體後抽象。因此在設計過程中如果你得到大量的具體概念並從當中找到其共性時,這個共性的集合就是抽象類應當是沒錯的。

2、inte***ce從表面上看,和抽象類很相似,但用法完全不同。它的基本功能就是把一些毫不相關的類(概念)集合在一起形成乙個新的、可集中操作的「新類」。我給學生的乙個典型例子就是「司機」。

誰可以當司機?誰都可以,只要領取了駕照。所以我不管你是學生,白領、藍領還是老闆,只要有駕照就是司機。

inte***ce driverlicence

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

這時候,car的物件並不關心這個司機到底是幹什麼的,他們的唯一共同點是領取了駕照(都實現了driverlicence介面)。這個,應當是介面最強大的地方也是抽象類無法比擬的。

總結:抽象類是提取具體類的公因式,而介面是為了將一些不相關的類「雜湊」成乙個共同的群體。通常我們平時養成良好的習慣就是多用介面,畢竟java是單繼承,不像c++,但是在需要使用抽象類的時候一定還是要用的(有點類似goto的用法),呵呵。

java中的介面和抽象類

java中抽象類和介面的區別?

2樓:靠名真tm難起

抽象類是用來捕捉子類的通用特性的 。它不能被例項化,只能被用作子類的超類。抽象類是被用來建立繼承層級裡子類的模板。

介面是抽象方法的集合。如果乙個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。

介面只是一種形式,介面自身不能做任何事情。

3樓:匿名使用者

簡單來說,

介面是公開的,裡面不能有私有的方法或變數,是用於讓別人使用的,而抽象類是可以有私有方法或私有變數的,

另外,實現介面的一定要實現介面裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是介面,然後是抽象類實現介面,最後才到具體類實現。

還有,介面可以實現多重繼承,而乙個類只能繼承乙個超類,但可以通過繼承多個介面實現多重繼承,介面還有標識(裡面沒有任何方法,如remote介面)和資料共享(裡面的變數全是常量)的作用.

4樓:仲維傳媒

「抽象類」和「介面」的區別如下:

1) 在抽象類中可以寫非抽象的方法,從而避免在子類中重複書寫他們,這樣可以提高**的復用性,這是抽象類的優勢;介面中只能有抽象的方法。

2) 乙個類只能繼承乙個直接父類,這個父類可以是具體的類也可是抽象類;但是乙個類可以實現多個介面。

圖中如果sparrow繼承類bird 類 ,boyin繼承airplane類,sparrow 和boyin想使用同樣的flay方法那麼是沒有辦法實現的,因為類的繼承是單繼承。

如果bird和airplane是介面那麼boyin想使用同樣的flay方法就很簡單了。在寫乙個介面讓sparrow和boyin實現這個介面就可以了如下圖:

5樓:匿名使用者

抽象方法是必須實現的方法。就象動物都要呼吸。但是魚用鰓呼吸,豬用肺呼吸。

動物類要有呼吸方法。怎麼呼吸就是子類的事了。

現在有很多討論和建議提倡用inte***ce代替abstract類,兩者從理論上可以做一般性的混用,但是在實際應用中,他們還是有一定區別的。抽象類一般作為公共的父類為子類的擴充套件提供基礎,這裡的擴充套件包括了屬性上和行為上的。而介面一般來說不考慮屬性,只考慮方法,使得子類可以自由的填補或者擴充套件介面所定義的方法,就像java王子所說的事件中的介面卡就是乙個很好的應用。

用乙個簡單的例子,比如說乙個教師,我們把它作為乙個抽象類,有自己的屬性,比如說年齡,教育程度,教師編號等等,而教師也是分很多種類的,我們就可以繼承教師類而擴充套件特有的種類屬性,而普遍屬性已經直接繼承了下來。

而介面呢~還是拿教師做例子,教師的行為很多,除了和普通人相同的以外,還有職業相關的行為,比如改考卷,講課等等,我們把這些行為定義成無body的方法,作為乙個集合,它是乙個inte***ce。而教師張三李四的各自行為特點又有不同,那麼他們就可以擴充套件自己的行為body。從這點意義上來說, inte***ce偏重於行為。

總之,在許多情況下,介面確實可以代替抽象類,如果你不需要刻意表達屬性上的繼承的話。

6樓:手機使用者

因為java是單根繼承的,所以能用介面盡量用介面,c++的介面就是通過抽象類實現的

java中什麼是介面?介面的作用是什麼?

7樓:老表有點呈

java介面:

1、java語言中存在的結構,有特定的語法和結構。

2、java語言中乙個類所具有的方法的特徵集合,是一種邏輯上的抽象。

java介面作用:

1、利於**的規範

這樣做的目的一方面是為了給開發人員乙個清晰的指示,告訴他們哪些業務需要實現;同時也能防止由於開發人員隨意命名而導致的命名不清晰和**混亂,影響開發效率。

2、有利於對**進行維護

可以一開始定義乙個介面,把功能選單放在介面裡,然後定義類時實現這個介面,以後要換的話只不過是引用另乙個類而已,這樣就達到維護、拓展的方便性。

3、保證**的安全和嚴密

乙個好的程式一定符合高內聚低耦合的特徵,能夠讓系統的功能較好地實現,而不涉及任何具體的實現細節。這樣就比較安全、嚴密一些,這一思想一般在軟體開發中較為常見。

8樓:宜都書童

java介面

是一系列方法的宣告,是一些方法特徵的集合,乙個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。

介面作用如下:

1、豐富java物件導向的思想:在java語言中, abstract class 和inte***ce 是支援抽象類定義的兩種機制。正是由於這兩種機制的存在,才賦予了java強大的物件導向能力。

2、提供簡單、規範性:如果乙個專案比較龐大,那麼就需要乙個能理清所有業務的架構師來定義一些主要的介面,這些介面不僅告訴開發人員你需要實現那些業務,而且也將命名規範限制住了(防止一些開發人員隨便命名導致別的程式設計師無法看明白)。

3、提高維護、拓展性:比如你要做乙個畫板程式,其中裡面有乙個面板類,主要負責繪畫功能,然後你就這樣定義了這個類,可是在不久將來,你突然發現這個類滿足不了你了,然後你又要重新設計這個類,更糟糕是你可能要放棄這個類,那麼其他地方可能有引用他,這樣修改起來很麻煩,如果你一開始定義乙個介面,把繪製功能放在介面裡,然後定義類時實現這個介面,然後你只要用這個介面去引用實現它的類就行了,以後要換的話只不過是引用另乙個類而已,這樣就達到維護、拓展的方便性。

4、增強安全、嚴密性:介面是實現軟體松耦合的重要手段,它描敘了系統對外的所有服務,而不涉及任何具體的實現細節。這樣就比較安全、嚴密一些(一般軟體服務商考慮的比較多)。

Java中抽象類和介面的區別,java中抽象類和介面的區別

簡單來說,介面是公開的,裡面不能有私有的方法或變數,是用於讓別人使用的,而抽象類是可以有私有方法或私有變數的,另外,實現介面的一定要實現介面裡定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裡,最頂級的是介面,然後是抽象類實現介面,最後才到具體類實現。還有,介面可以實現多重繼承...

c抽象類和普通類的區別,java中抽象類和介面的區別?

1.c 沒有abstract.vc提供了乙個inte ce 2.抽象類就是指不能例項化的類,因為它們包含了純虛方法。3.虛函式是在申明的時候用了關鍵字virtual的類的 非靜態 成員函式 java中抽象類和介面的區別?抽象類是用來捕捉子類的通用特性的 它不能被例項化,只能被用作子類的超類。抽象類是...

java中抽象類可以繼承實體類嗎

抽象類可以繼承實體類,因為抽象類中不僅可以有抽象方法,也可以有非抽象方法,抽象類繼承了實體類則即包括自己的抽象方法也包括了繼承來的非抽象方法 1 抽象類只是乙個特殊的類,但是也具備類的特性。2 如果這個類中有抽象方法,那麼這個類必須定義為抽象類。3 如果這個抽象類繼承了別的抽象類,那麼可以不覆蓋抽象...