php抽象類和介面的區別
㈠ php的抽象類和介面的區別
介面中不可以聲明成員變數(包括類靜態變數),但是可以聲明類常量。抽象類中可以聲明各種類型成員變數,實現數據的封裝。
介面沒有構造函數,抽象類可以有構造函數。
介面中的方法默認都是public類型的,而抽象類中的方法可以使用private,protected,public來修飾。
一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
㈡ 抽象類和介面的區別與聯系
1.抽象類:規定了一系列的方法,並規定了必須由繼承類實現的方法。由於有抽象方法的存在,所以抽象類不能實例化。可以將抽象類理解為毛坯房,門窗,牆面的樣式由你自己來定,所以抽象類與作為基類的普通類的區別在於約束性更強。
2.介面類:與抽象類很相似,表現在介面中定義的方法,必須由引用類實現,但他與抽象類的根本區別在於用途:與不同個體間溝通的規則,你要進宿舍需要有鑰匙,這個鑰匙就是你與宿舍的介面,你的舍友也有這個介面,所以他也能進入宿舍,你用手機通話,那麼手機就是你與他人交流的介面。
3.區別和關聯:
1.介面是抽象類的變體,介面中所有的方法都是抽象的,而抽象類中可以有非抽象方法,抽象類是聲明方法的存在而不去實現它的類
2.介面可以繼承,抽象類不行
3.介面定義方法,沒有實現的代碼,而抽象類可以實現部分方法
4.介面中基本數據類型為static而抽象類不是
㈢ 介面抽象類區別
區別一,兩者表達的概念不一樣。抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來說,對於抽象類來說,屬於「是」的關系;而介面是定義行為規范,因此對於實現介面的子類來說,相對於介面來說,是「行為需要按照介面來完成」。這些聽起來有些虛,舉個例子。例如,狗是對於所有狗類動物的統稱,京哈是狗,牧羊犬是狗,那麼狗的一般特性,都會在京哈,牧羊犬中找到,那麼狗相對於京哈和牧羊犬來說,就屬於這類事物的抽象類型;而對於「叫」這個動作來說,狗可以叫,鳥也可以叫。很明顯,前者相當於所說的是抽象類,而後者指的就是介面。
區別二,抽象類在定義類型方法的時候,可以給出方法的實現部分,也可以不給出;而對於介面來說,其中所定義的方法都不能給出實現部分。
例如:
Code
區別三,繼承類對於兩者所涉及方法的實現是不同的。繼承類對於抽象類所定義的抽象方法,可以不用重寫,也就是說,可以延用抽象類的方法;而對於介面類所定義的方法或者屬性來說,在繼承類中必須要給出相應的方法和屬性實現。
區別四,在抽象類中,新增一個方法的話,繼承類中可以不用作任何處理;而對於介面來說,則需要修改繼承類,提供新定義的方法。
知道了兩者的區別,再來說說,介面相對於抽象類的優勢。
好處一,介面不光可以作用於引用類型,也可以作用於值類型。而抽象類來說,只能作用於引用類型。
好處二,.Net的類型繼承只能是單繼承的,也就是說一個類型只能繼承一個類型,而可以繼承多個介面。其實,我對於這一點也比較贊同,多繼承會使繼承樹變的混亂。
好處三,由於介面只是定義屬性和方法,而與真正實現的類型沒有太大的關系,因此介面可以被多個類型重用。相對於此,抽象類與繼承類的關系更緊密些。
好處四,通過介面,可以減少類型暴露的屬性和方法,從而便於保護類型對象。當一個實現介面的類型,可能包含其他方法或者屬性,但是方法返回的時候,可以返回介面對象,這樣調用端,只能通過介面提供的方法或者屬性,訪問對象的相關元素,這樣可以有效保護對象的其他元素。
㈣ 「抽象類」和「介面」的區別是什麼
它們的區別主要有以下幾點:
1、 介面是抽象類的變體,介面比抽象類更加抽象,介面中所有的方法都是抽象的。
2、每個類只能繼承一個抽象類,但是可以實現多個介面。
3、抽象類中不一定都是抽象方法,抽象的而抽象類可以實現部分方法。但是介面中方法必須為public修飾的、抽象的不能實現具體的法。
4、介面中基本數據類型為static而抽象類不是的。
(4)php抽象類和介面的區別擴展閱讀:
抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。
通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。
抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變數的角色。
介面泛指實體把自己提供給外界的一種抽象化物(可以為另一實體),用以由內部操作分離出外部溝通方法,使其能被內部修改而不影響外界其他實體與其交互的方式。
人類與電腦等信息機器或人類與程序之間的介面稱為用戶界面。電腦等信息機器硬體組件間的介面叫硬體介面。電腦等信息機器軟體組件間的介面叫軟體介面。
在計算機中,介面是計算機系統中兩個獨立的部件進行信息交換的共享邊界。這種交換可以發生在計算機軟、硬體,外部設備或進行操作的人之間,也可以是它們的結合。
㈤ php中介面和抽象類的區別
區別:
1、對介面的使用是通過關鍵字implements。對抽象類的使用是通過關鍵字extends。當然介面也可以通過關鍵字extends繼承。
2、介面中不可以聲明成員變數(包括類靜態變數),但是可以聲明類常量。抽象類中可以聲明各種類型成員變數,實現數據的封裝。(另JAVA介面中的成員變數都要聲明為public static final類型)
3、介面沒有構造函數,抽象類可以有構造函數。
4、介面中的方法默認都是public類型的,而抽象類中的方法可以使用private,protected,public來修飾。
5、一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
抽象類還是介面。
如果要創建一個模型,這個模型將由一些緊密相關的對象採用,就可以使用抽象類。如果要創建將由一些不相關對象採用的功能,就使用介面。
如果必須從多個來源繼承行為,就使用介面。
如果知道所有類都會共享一個公共的行為實現,就使用抽象類,並在其中實現該行為。
㈥ PHP的抽象類,介面類的區別和選擇
一、抽象類裡面的方法可以有實現,但是介面裡面的方法確是只能聲明。
二、介面是設計的結果
抽象類是重構的結果
三、java不支持多重繼承,所以繼承抽象類只能繼承一個,但是可以實現多個介面。
1 介面是核心,其定義了要做的事情,包含了許多的方法,但沒有定義這些方法應該如何做。
2 如果許多類實現了某個介面,那麼每個都要用代碼實現那些方法
3 如果某一些類的實現有共通之處,則可以抽象出來一個抽象類!
㈦ 介面和抽象類的區別是什麼
介面和抽象類的區別是:
知識點
在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
介面,在JAVA編程語言中是一個抽象類型,是抽象方法的集合,一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
介面
介面不能被實例化
介面中沒有構造方法
使用 implements 繼承介面,支持多繼承
實現某個介面的類必須在類中實現該介面的全部方法
介面中的變數必須是 public static final 類型的(常量)
抽象類
不能被實例化
使用extends繼承抽象類,支持單繼承
抽象類中的變數和普通類中的變數一樣
抽象類可以有靜態代碼塊和靜態方法
如果類中有抽象方法,則必須為抽象類
抽象類中可以有非抽象方法
抽象方法的類型
㈧ 介面和抽象類的區別是什麼
「抽象類」和「介面」的區別:
1、介面可以被多重implement*,抽象類只能被單一extends。
2、介面只有定義,抽象類可以有定義和實現 。
3、介面的欄位定義默認為:public static final, 抽象類欄位默認是「friendly」。
4、介面沒有構造方法,抽象類可以有構造方法。
抽象類
抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里子類的模板。
介面
介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。
㈨ 抽象類和介面有什麼區別
答得稀爛。。。
網上再學習了一次,在這里記下看到各位大蝦的金言。
一、抽象類:
在面向對象領域,抽象類主要用來進行類型隱藏。那什麼是類型隱藏呢?我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。好比,動物是一個抽象類,人、猴子、老虎就是具體實現的派生類,我們就可以用動物類型來隱藏人、猴子和老虎的類型。( 參考doSome方法)二、介面:
三、抽象類和介面的區別:
首先,抽象類在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個介面。也許,這是Java語言的設計者在考慮Java對於多重繼承的支持方面的一種折中考慮吧。 其次,在抽象類的定義中,我們可以賦予方法的默認行為。但是在介面的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委託,但是這會 增加一些復雜性,有時會造成很大的麻煩。 抽象類在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在」is a」關系,即父類和派生類在概念本質上應該是相同的。對於介面來說則不然,並不要求介面的實現者和介面定義在概念本質上是一致的,僅僅是實現了介面定義的契約而已。介面表示的是」like
a」關系。 使用抽象類來定義允許多個實現的類型,比使用介面有一個明顯的優勢:抽象類的演化比介面的演化要容易的多。在後續的發行版中,如果希望在抽象類中增加一個方法,只增加一個默認的合理的實現即可,抽象類的所有實現都自動提供了這個新的方法。對於介面,這是行不通的。雖然可以在骨架實現類中增加一方法的實現來解決部分問題,但這不能解決不從骨架實現類繼承的介面實現的問題。由此,設計公有的介面要非常謹慎,一旦一個介面被公開且被廣泛實現,對它進行修改將是不可能的。 所以,使用介面還是抽象類,取決於我們對問題的概念的本質理解和設計的意圖。
Java介面與抽象類的相同點:
1. 都不能被實例化。
2. 都能包含抽象方法。
抽象類與介面緊密相關。然介面又比抽象類更抽象,這主要體現在它們的差別上:1)類可以實現無限個介面,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現介面,從而得出介面是用來解決多重繼承問題的。2)抽象類當中可以存在非抽象的方法,可介面不能且它裡面的方法只是一個聲名必須用public來修飾沒有具體實現的方法。3)抽象類中的成員變數可以被不同的修飾符來修飾,可介面中的成員變數默認的都是靜態常量(static fainl)。4)這一點也是最重要的一點本質的一點抽象類是對象的抽象,然介面是一種行為規范。
例如每個介面可以代表一種最頂層的抽象,可以理解為代表一類東西,如果一個類實現了多個介面,那這個類就有了多種類型,即介面是定義混合類型的理想工具最後:有一種設計模式,就是,默認適配模式,意思就是說,首先定義一個介面,通過抽象類實現這個介面,並實現一些子類不需要一定實現的方法,然後,子類就可以選擇是繼承介面,實現所有方法,還是直接繼承這個抽象類實現具體需要的方法,
定義成抽象類是為了以後要其子類來繼承的,因為父類里有很多方法是無法定義具體的實現的,只能定義一個原型,讓子類來分別實現!所以要定義成抽象的!
簡單來說就是
抽象類是在介面和實體類之間的一個橋梁例如做一個介面叫做飛行FlyAnimalAction,裡面定義一個方法叫做flying,再定義一個方法叫做eat
做一個類叫做蚊子實現介面,蚊子要實現flying方法,實現自己的eat方法
做一個類叫做蒼蠅實現介面,蒼蠅也要實現flying方法,實現自己的eat方法
你發現所有會飛的動物都要實現這個介面,很麻煩,不如
做一個抽象類FlyAnimal,然後實現上面的介面
在裡面實現flying這個方法,因為大部分的飛行動作是一樣的,而eat方法則繼續寫成抽象方法,因為大部分的動物吃東西是不一樣的
下面你再寫蚊子類就簡單了,可以直接繼承這個抽象類,然後實現自己的吃方法就行了
而且蒼蠅類的製作也是一樣,這個時候抽象類的功能就顯示出來了,當然抽象類的功能遠遠不是這些,只是初期理解到這里就夠了。
㈩ 抽象類和介面的區別在哪裡
1、方法不同
介面的方法默認是 public,所有方法在介面中不能有實現(Java 8 開始介面方法可以有默認實現),而抽象類可以有非抽象的方法。
2、質量不同
介面中除了static、final變數,不能有其他變數,而抽象類中則不一定。
3、數量不同
一個類可以實現多個介面,但只能實現一個抽象類。介面自己本身可以通過extends關鍵字擴展多個介面。
4、修飾符不同
介面方法默認修飾符是public,抽象方法可以有public、protected和default這些修飾符(抽象方法就是為了被重寫所以不能使用private關鍵字修飾)。
5、設計層面不同
抽象是對類的抽象,是一種模板設計,而介面是對行為的抽象,是一種行為的規范。
(10)php抽象類和介面的區別擴展閱讀;
介面可以是命名空間或類的成員,並且可以包含下列成員的簽名:
方法屬性索引器事件一個介面可從一個或多個基介面繼承。
當基類型列表包含基類和介面時,基類必須是列表中的第一項。
實現介面的類可以顯式實現該介面的成員。顯式實現的成員不能通過類實例訪問,而只能通過介面實例訪問。
參考資料來源;網路——抽象類
網路——介面