標籤:應用 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實現物件導向編程——第四章 異常