標籤:應用 override over 必須 src width 網上 用法 選擇
1、 介面:介面就是給出一些沒有內容的方法,封裝到一起,到某個類要使用的時候,在根據具體情況把這些方法寫出來。
介面是更加抽象的抽象的類, 抽象類別裡的方法可以有方法體, 介面裡的所有方法都沒有方法體。 介面體現了程式設計的多態和高內聚低偶合的設計思想。 |
介面是一種規範和標準,他們可以約束類的行為,是一些方法特徵的集合,但是沒有方法的實現。 |
介面可以看作一種特殊的“抽象類別”,但是採用與抽象類別按群不同的文法來表示; |
抽象類別有利於代碼的重用,介面有利於代碼的擴充和維護; |
介面的特性: 介面不可以被執行個體化 實作類別必須實現介面的所有方法 // 常作為類型使用 實作類別可以實現多個介面 //Java中的多繼承 介面中的變數都是靜態常量,(屬性都是全域靜態常量,方法都是全域抽象方法) |
介面有比抽象類別更好的特性: 1.可以被多繼承 2.設計和實現完全分離 3.更自然的使用多態 4.更容易搭建程式架構 5.更容易更換實現 |
介面注意事項: 1、介面不能被執行個體化 2、介面中所有的方法都不能有主體。錯誤文法例:void aaa(){}←(注意不能有花括弧),介面可以看作更加抽象的抽象類別。 3、一個類可以實現多個介面,非抽象類別實現介面時必須實現介面中的全部方法,(抽象類別利於代碼複用,介面利於代碼維護) 4、介面中可以定義常量(int a=1;//加不加static都是靜態,不能用private和protected修飾),不能定義變數 ★介面中可以有變數[但變數不能用private和protected修飾],介面中的變數,本質上都是static的而且是final類型的,不管你加不加static修飾。 訪問形式:介面名.變數名 ★在java中,把常用的變數,定義在介面中,作為全域變數使用,介面中的屬性都會自動用public static final修飾,即介面中的屬性都是全域靜態變數; 5、一個介面不能繼承其它的類,但是可以繼承別的介面 6、介面名命規則與類相同,public在整個項目中可見,如果省略,則只能在當前包中可見; 7、一個重要的原則:當一個類實現了一個介面,要求該類把這個介面的所有方法全部實現,否則必須定義為抽象類別; 8、介面中所有方法都是抽象方法,介面中方法都會自動調用public abstract修飾;即介面中只有全域抽象方法; 9、和抽象類別一樣,介面也不能執行個體化,介面中不能有構造方法; 10、介面之間可以通過extends實現繼承關係,一個介面可以繼承多個介面,但不能繼承類; |
JAVA中介面的定義文法: 修飾符 interface 介面名 extends父介面1,父介面2,……{ //常量定義 //方法定義 } |
使用介面:eg:usb介面: |
類介面的實現文法: class 類名 extends父類名 implements 介面1,介面2,……{ //類成員 } |
2、 使用介面:一個類只能有一個直接父類,但可以通過implements實現多個介面,當類在繼承父類的同時又實現了多個介面時,extends關鍵字必須位於implements關鍵字之前;
介面表示一種能力:體現在介面的方法上 ●面向介面編程: |
介面是一種約定:體現在介面名稱和注釋上; ●面向介面編程:程式設計時面向介面的約定而不考慮具體實現;
|
3、在C#中定義介面文法:
文法: |
實現文法:
|
Eg:定義介面: |
定義實作類別: |
注意事項: 介面之間可以通過“:”來實現繼承關係,一個介面可以繼承多個介面,但介面不能繼承類; 類只能繼承一個父類,但可以實現多個介面,使用“:”來繼承類並實現介面; 介面定義零個或多個成員,成員主要是方法、屬性和索引器。介面中不能包含常量、變數和構造方法,也不能包含任何靜態成員; 介面中成員存取修飾詞時public,定義介面時顯示指定任意修飾符都是非法的; 按照慣例,C#中介面以大寫字母“I“開頭; |
4、JAVA介面與C#介面對比:
|
JAVA |
C# |
定義 |
interface |
interface |
實現 |
implements |
: |
靜態成員 |
常量 |
無 |
public |
可以顯示使用 |
不能顯示使用 |
5、抽象類別與介面應用方式:
抽象類別 不能對欄位抽象(因為欄位只能用等號賦值,沒其他代碼(不同於屬性),沒什麼抽象的意義); 不能對 private 抽象; 可以含有非抽象的成員; 不能執行個體化; 只能從一個類繼承; 可以被抽象類別繼承,此時不必實現抽象成員; 可以被普通類繼承,此時必須實現抽象成員(網上有些說的不必實現,其實那有錯誤,普通類繼承自抽象類別時,必須實現抽象類別的全部抽象成員); 實現抽象成員時要加 override; |
介面: 不能對欄位介面(因為欄位只能用等號賦值,沒其他代碼(不同於屬性),沒啥介面的意義); 介面只能是 public 的,且不能使用 public 關鍵字; 除了介面成員,不能有其他任何實現代碼; 不能執行個體化; 可以從多個介面繼承; 可以被介面繼承;此時不必也無法實現介面成員; 可以被抽象類別繼承,此時必須實現介面成員; 可以被普通類繼承,此時必須實現介面成員; 實現介面不能加 override,必須加 public。 |
7、附加:
●java的繼承是單繼承,也就是一個類最多隻能有一個父類,這種單繼承的機制可保證類的純潔性,比C++中的多繼承機制簡潔。但是不可否認,對子類功能的擴充有一定影響。所以: 1、 實現介面可以看作是對繼承的一種補充。(繼承是層級式的,不太靈活。修改某個類就會打破繼承的平衡,而介面就沒有這樣的麻煩,因為它只針對實現介面的類才起作用); 2、實現介面可在不打破繼承關係的前提下,對某個類功能擴充,非常靈活。 |
●介面是一個抽象類別,介面中的方法是一個就有public存取修飾詞的方法,介面中的屬性是一個靜態常量; 介面中的方法預設為public abstract,即使不寫。介面中的方法不能被static修飾。 |
- ●class是類的定義,extends是繼承的關鍵字,implements是實現介面的關鍵字,interface是定義介面的關鍵字;
|
●介面的描述: |
●介面類型實作類別對象,也是多態的一種表現; ●介面是一個特殊的抽象類別,介面中的所有方法都是抽象方法,所有的屬性都是靜態常量; |
介面是Java提供的一個物件導向的機制; 介面可以繼承介面; 使用介面是為了降低模組之間的耦合度; 一個類中可以實現多個介面:Java介面是一系列方法的聲明,是一些方法特徵的集合,一個介面只有方法的特徵,沒有方法的實現, 因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能); 介面中只可以定義常量不可以定義變數是:如果介面可以定義變數,但是介面中的方法又都是抽象的,在介面中無法通過行為來修改屬性; |
●一個類實現介面,介面與實作類別之間就是父-子關係 。子類本身執行個體化,子類執行個體化後賦值給父介面都是正常的,這是向上轉型 ●介面中定義的都是全域的公用的常量,會預設加上修飾符public、static、final。 ●聲明介面: |
| |
介面裡變數只能是靜態常量,必須賦值; 方法必須抽象方法; 介面只能使用public進行修飾,或者省略; |
●eg: 分析: 介面中定義的屬性都是靜態常量,4個選項中沒有修改該常量, 所以沒有異常,因此選擇c; |
●eg: 分析: 在java一般的用法中,如果要用普通類來實現介面,則必須實現該介面中的所有方法,這樣就會導致需要實現多餘的方法; 採用抽象類別來實現方法,可以實現該介面中的部分方法,而且當其他類繼承該抽象類別時,只需要實現抽象類別中未實現的方法即可。 例: 抽象類別B只實現了介面A中的方法a、b, 當類C繼承類B時,只需要實現B中未實現的介面c即可。 一般情況下,類C中的方法a、b都是調用父類B的方法a、b |
●eg: |
●eg: 分析: 調用study()方法時,要站在study()方法所在位置分析, 因為kid對象位於main方法裡,並沒有將age=5以參數形式傳給study()方法中。 因此,study()方法在運行時,預設調用的是類下面的age成員變數。 |
● 介面不能包含具體方法,所以介面不能繼承類(繼承抽象類別也不行)。 介面可以繼承多個更小的介面,這也是介面常用設計思路的基礎: 先細分程式功能,把每個獨立的小功能都定義成微型介面,再以繼承的方式,用小介面拼裝出大型的多功能介面,方便為不同客戶的具體需求實現定製化介面。發布和暴露給使用者使用的是多功能的大介面;單一職能的眾多小介面則保留給自己,因為每個小介面功能獨立且互不依賴,方便調試和維護。 值得注意的是,抽象類別可以繼承普通類,實現以普通類為基礎,擴充抽象方法。 C#中,有所謂“擴充方法”的設定,無需繼承也可以擴充一個現有類的方法。 |
●介面中只能聲明靜態常量,聲明變數時可以不用final static 關鍵字,但必須賦初始值。 介面中的方法是預設或公開的抽象方法,不能有方法體;可以省略abstract關鍵字。 |
●public和abstract關鍵字可以修飾類和介面,介面名後無有() final可以修飾類但不能修飾介面; |
●Java介面與抽象類別的區別, 介面只能存在public成員,而抽象類別可以存在public,private,protected,default成員; 介面只能存在抽象方法,抽象類別存在抽象方法和執行個體方法。 介面只能存在靜態常量,而抽象類別可以存在執行個體成員; 介面沒有構造方法,而抽象類別存在。 |
使用Java實現物件導向編程——第四章 異常