java接口概述
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java 接口概念 ; 
 0.2)接口技術: 這種技術主要用來描述類具有什么功能, 并不給出每個功能的具體實現(xiàn); 一個類可以實現(xiàn)多個接口, 但只允許單繼承; 
 0.3) 最后簡單闡述了 接口和抽象類 的 區(qū)別;
【1】 接口
1.1)接口中的所有方法自動屬于public: 故,在接口中聲明方法時,不必提供關鍵字public; 
 1.2)接口可以包含多個方法: 在接口中還可以定義常量;然而,更重要的是 要知道接口不能提供哪些功能;接口不能提供實例域, 也不能在接口中實現(xiàn)方法, 提供實例域和方法實現(xiàn)的任務應該由實現(xiàn)接口的那個類來完成;因此,可以將接口看做是沒有實例域的抽象類,但接口和抽象類還是有區(qū)別的, 稍后給出解釋; 
 1.3)為了讓類實現(xiàn)一個接口, 需要以下兩個steps:
- step1)將類聲明為實現(xiàn)給定的接口;
- step2)對接口中的所有方法進行定義;
- Warning)因為 接口中的所有方法自動屬于public, 故,在接口中聲明方法時,不必提供關鍵字public;但是 ,類在實現(xiàn)接口時,必須把方法聲明為 public, 否則,編譯器將認為這個方法的 訪問屬性是包可見性, 即類的默認訪問屬性;
1.4)排序訪問必須讓它實現(xiàn) compareTo 方法:我們已經看到, 要讓一個類使用排序訪問必須讓它實現(xiàn) compareTo 方法,這是理所當然的,因為要向 sort方法提供對象的比較方式; 
 1.5)但是 , 為什么不能在 Employee類直接提供一個 compareTo 方法, 而必須實現(xiàn) Comparable 接口呢? 主要原因在于 java 是一種強類型的語言;在調用方法的時候, 編譯器將會檢查這個方法是否存在, 如,
編譯器必須確認 a[i] 一定有 compareTo 方法,如果a 是一個 Comparable 對象 的數(shù)組, 就可以確保擁有 compareTo 方法,因為每個實現(xiàn) Comparable 接口的類都必須提供這個方法的定義; 
 1.6)看個荔枝: 
 
Annotation)
- A1)語言標準規(guī)定: 對于任意的x 和 y, 實現(xiàn)必須能夠保證 sgn(x.compareTo(y)) = -sgn(y.compareTo(x)); 這也就是說, 如果y.compareTo(x) 拋出 一個異常,那么 x.compareTo(y) 也應該拋出一個異常;
- A2)這里的sgn 是一個數(shù)值的符號: 如果n為負值, sgn(n) 等于 -1, 如果n是0, sgn(n) 等于0;如果n是正數(shù), sgn(n) 等于1;
- A3)簡單講, 如果調換compareTo 的參數(shù),結果的符號也應該調換(而不是實際值);
出現(xiàn)的問題)因為 Manager 擴展了 Employee, 而 Employee實現(xiàn)的是Comparable , 而不是 Comparable, 如果 Manager覆蓋了 compareTo, 就必須要有經理 與 雇員進行比較的心理準備, 決不能僅僅將 雇員轉換為 經理;
class Manager extends Employee {public int compareTo(Employee other){Manager otherManger = (Manager)other; //NO......} }- P1)這不符合 “反對稱”的規(guī)定:如果x是一個 Employee對象, y 是一個 Manager對象, 調用 x.compareTo(y) 不會拋出異常, 它只是將 x 和 y 都作為雇員進行比較。 但是反過來, y.compareTo(x) 將會拋出一個 ClassCastExcaption;
解決辦法(Solutions):
- S1)如果子類之間的比較含義不一樣, 那就屬于不同類對象 的非法比較, 每個 compareTo 方法都應該在開始時 進行下列檢測:
- S2)如果存在這樣一種通用算法, 它能夠對兩個不同的子類對象進行比較,則應該在超類中提供一個 compareTo方法, 并將這個方法法聲明為final;
- S3)假如 不管薪水的多少,都想讓 manager 大于 雇員, 即如果要按照職務排列 的話, 那就應該在 Employee類中 提供一個 rank方法, 每個子類覆蓋rank, 并實現(xiàn)一個 比較 rank值的 compareTo 方法;
【2】 接口的特性
2.1)可以聲明接口變量, 且接口變量必須引用實現(xiàn)了接口的類對象:
Comparable x ; 這是OK 的; x = new Employee();2.2)可以使用 instanceof 檢查一個對象是否實現(xiàn)了某個特定的接口:
if(anObject instanceof Comparable) {}2.3)接口也可以繼承, 這里允許存在多條從具有較高通用性接口到較高專用性接口的鏈:看個荔枝
public interface Moveable {void move(double x, double y); } //然后用 Movable 擴展一個 Powered 的接口: public interface Powered extends Moveable {double milesPerGallon(); } //雖然在接口中不能包含實例域或靜態(tài)方法, 但可以包含常量: public interface Powered extends Moveable {double milesPerGallon();double SPEED_LIMIT = 95; // a public static final constant }- Attention)與接口中的方法都自動被設置為 public, 接口中的 域都被自動設為 public static final ;
- Annotation)有些接口只是定義了常量,而沒有定義方法, 這樣應用接口似乎有點偏離了接口概念的初衷,所以, 最好不要這樣用它;
2.4)類是單繼承,但是可以實現(xiàn)多個接口;看個荔枝: 
 java 中有一個 非常重要的 內置接口, Cloneable, 如果某個類實現(xiàn)了這個Cloneable 接口,Object類中的 clone 方法就可以創(chuàng)建類對象的一個copy, 如果希望自己設計的類擁有 克隆和比較的能力, 只要實現(xiàn)這兩個接口就可以了(一個類可實現(xiàn)多個接口);
【3】接口與抽象類
3.1)疑問?為什么java還要不辭辛苦引入接口概念? 為什么不將 Comparable直接設計成抽象類:
abstract class Comparable {public abstract int compareTo(Object obj); } //然后, Employee再擴展這個抽象類, 并提供 compareTo方法的實現(xiàn): class Employee extends Comprable {public int compareTo(Object other){ ... } }3.2)使用抽象類表示通用屬性存在這樣一個問題:每個類只能擴展一個類, 假設 Employee 類已經擴展了一個類, 比如Person, 它就不能再像下面這樣擴展第二個類了; 但是每個類可以實現(xiàn)多個接口:
class Employee extends Person implements Comparble //OK總結
 
                            
                        - 上一篇: 利用反射机制创建新类的两种方式及比较
- 下一篇: 网易企业邮箱怎么申请(网易企业邮箱怎么申
