1. 程式人生 > >接口裏可以有變量麽?

接口裏可以有變量麽?

這一 and .net 不一定 cells itl 修改屬性 含義 color

淺談為什麽Java接口中不允許定義變量?

它們是公共的,靜態的,最終的常量。相當於全局常量。抽象類是不“完全”的類,相當於是接口和具體類的一個中間層。即滿足接口的抽象,也滿足具體的實現。

如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過實現接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態變量 a。按照 Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那麽實現接口 A 的所有對象也都會自動擁有這一改變後的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟著變了。這和抽象類有什麽區別呢,怎麽體現接口更高的抽象級別呢,怎麽體現接口提供的統一的協議呢,那還要接口這種抽象來做什麽呢?所以接口中不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統一的屬性。

通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。

本文轉自http://developer.51cto.com/art/200906/130093.htm

Java接口和抽象類的區別 收藏 簡單來說, 接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的,另外,實現接口的一定要實現接口裏定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法。 一般的應用裏,最頂級的是接口,然後是抽象類實現接口,最後才到具體類實現。 還有,接口可以實現多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個接口實現多重繼承,接口還有標識(裏面沒有任何方法,如Remote接口)和數據共享(裏面的變量全是常量)的作用.

1.abstract class 在 Java 語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface. 2.在abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是 static final的,不過在 interface中一般不定義數據成員),所有的成員方法都是abstract的。 3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。 4.實現抽象類和接口的類必須實現其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現方法。 5.接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。 6.抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。 7.接口中的方法默認都是 public,abstract 類型的。

 
 
接口中不能有私有成員,不能有實現方法,只有方法聲明,
接口沒有實例化,只能是
(接口) ITest test = new Test();實際上還是實例化了接口的實現類

抽象類中可以有私有成員,可以有實現方法 

他自己都能實例化了還要斷承和實現類做啥(哈哈,這是俗一點的說法)

有時間在網上看看接口和抽象類的區別
================================================
接口可以實例化

一般對象比如有個具體的類Person已定義好,要實例化它, 采取的語法是 Person objPerson = new Person();

但接口(如IConnection)不能這麽做,其不能直接New 自己,如 IConnection objIConnection = new IConnection(),

這就是說"照例不可以生成接口的對象"的含義.

但面向對象都具有多態,可以向上轉型, 比如某個類實現了該接口,如類Connection實現了該接口,則Connection類的

實例化對象可以給IConnection接口. 如 IConnection objIConnection = new Connection()

然後編程都基於接口進行操作,這樣脫離了具體的類的實現,在某些場合就更靈活和易於擴充.

把變的東西抽象出來了,成了接口,反倒就讓代碼相對固定了,能適應變化的情況.

接口不能實列化,但是可能通過某些類創建接口的對類

==================================================

接口不能“直接”實例化。--msdn //沒說不能“間接” “間接”實例化接口 接口 實例 = new 實現接口的類() 長見識

===================================================

類-抽象類-接口總結 近期通過對Java一些基礎知識的學習,我熟悉了類抽象類以及接口這三個概念,先將其區別與聯系總結如下! 1 三者最大的[color=indigo]區別在[u][/u]於類具有構造器從而可以來構造對象!而抽象類與接口中的方法都是未完全實現,他們都是一種抽象模型,不具備構造對象的能力!但是可以通過實現(implements)接口和繼承(extends)抽象類來創建類從而來構造對象! 2在定義上:類的定義模式是public+class+類名[b];抽象類的定義public+abstract+clas+類名;接口的定義格式public+interface+類名 3在方法上類的方法必須有實現而抽象類的方法可以根據需要部分實現;而接口中的方法只能有其定義沒有具體的實現,就是說接口中的方法都是抽象的方法!抽象類中可以有非抽象方法。接口中則不能有實現方法 4抽象類和接口在繼承和實現時子類對父類中未實現的方法必須實現可對其進行重寫! 5接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變!

=============================================================

抽象類,通過繼承它實現多態,後期綁定,可以為將來要實現的東西做好接口,實現重用性。

InterfaceA IA = new InterfaceA();

編譯器報錯:Cannot instantiate the type TA 指明接口只能被聲明,不能被實例化。

簡單工廠設計模式

設定一個Class名稱是AClass,在面向對象編程中,一般一個Class都會繼承一個接口,設定AClass的接口為AInterface,那麽生成AClass的對象方法如下:

AInterface a = new AClass();

改寫成下列方式: AInterface a = Afactory.create(); //代碼2

Afactory的create方法封裝了具體創建細節。解耦了創建過程和使用過程,系統可擴展性增強,穩定性增強。 Afactory的create方法代碼: public static AInterface create(){ …… return new AClass(); }

上面代碼2這一行是使用Afactory的create方法來生成AInterface實例。

由於是初學者,之前一直對上面這句很困惑,前幾天看到一個用抽象類實現接口的案例,為什麽不直接用抽象類的實例的方法?

網上的解答:

接口是強制性的,它的所有方法都要實現。

但是抽象類不是,比如說一個接口,你只用到其中的一兩個方法,可是如果直接實現接口需要實現裏面的五個方法,這時候你可以先讓抽象類實現接口,然後你的類繼承接口,就不需要都實現接口的方法了而且接口的抽象層次要更高,是一種契約,抽象類是提供了很多的方法,給你用,沒有強制性。

抽象類和接口比起來,有一個好處,就是某些函數可以實現具體的方法,而並不一定是聲明抽象的方法,而接口只能聲明抽象方法,所以用一個抽象類來實現某個接口可以實現一些通用的方法,而這些具體實現的方法裏還可以調用抽象方法,所以減少了子類中的重復代碼

=======================================================

我也談談抽象類和接口的理解,它們最根本的區別是:
  • 抽象類的子類是繼承,而接口的子類是實現.唯一性的繼承讓子類有其父類除私有外的一切責任和義務,意味著更與父類有更緊密的耦合;接口則不是唯一的,可根據需要實現或不實現,這種可選擇性意味著松耦合和靈活.
所以,如果是極少變動的,或者說內置的特征,我們用抽象類,比如性別,一旦出生,性別就固定,那繼承自male類即使高耦合也沒什麽影響.但你從事什麽職業,卻是很可能變動的,你今天可能是程序員,明年則可能幹起了個體戶,那implement一個programmer接口更合適.其實你也許已經註意到,一旦你繼承male類,你就和male緊密的耦合了,因為你一輩子都生不了孩子,而不像programmer那樣,你還有的選...

強烈推薦"敏捷軟件開發-原則模式和實踐"這本書,對提高編碼質量,或將思維從實現提升設計層面,都很有幫助.

接口裏可以有變量麽?