日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java接口概述

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java接口概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java 接口概念 ;
0.2)接口技術: 這種技術主要用來描述類具有什么功能, 并不給出每個功能的具體實現; 一個類可以實現多個接口, 但只允許單繼承;
0.3) 最后簡單闡述了 接口和抽象類 的 區別;


【1】 接口

1.1)接口中的所有方法自動屬于public: 故,在接口中聲明方法時,不必提供關鍵字public;
1.2)接口可以包含多個方法: 在接口中還可以定義常量;然而,更重要的是 要知道接口不能提供哪些功能;接口不能提供實例域, 也不能在接口中實現方法, 提供實例域和方法實現的任務應該由實現接口的那個類來完成;因此,可以將接口看做是沒有實例域的抽象類,但接口和抽象類還是有區別的, 稍后給出解釋
1.3)為了讓類實現一個接口, 需要以下兩個steps:

  • step1)將類聲明為實現給定的接口;
  • step2)對接口中的所有方法進行定義;
  • Warning)因為 接口中的所有方法自動屬于public, 故,在接口中聲明方法時,不必提供關鍵字public;但是 ,類在實現接口時,必須把方法聲明為 public, 否則,編譯器將認為這個方法的 訪問屬性是包可見性, 即類的默認訪問屬性;

1.4)排序訪問必須讓它實現 compareTo 方法:我們已經看到, 要讓一個類使用排序訪問必須讓它實現 compareTo 方法,這是理所當然的,因為要向 sort方法提供對象的比較方式;
1.5)但是 , 為什么不能在 Employee類直接提供一個 compareTo 方法, 而必須實現 Comparable 接口呢? 主要原因在于 java 是一種強類型的語言;在調用方法的時候, 編譯器將會檢查這個方法是否存在, 如,

if(a[ i ].compareTo(a[ j ]) > 0) { ............ }

編譯器必須確認 a[i] 一定有 compareTo 方法,如果a 是一個 Comparable 對象 的數組, 就可以確保擁有 compareTo 方法,因為每個實現 Comparable 接口的類都必須提供這個方法的定義;
1.6)看個荔枝:

[API] java.lang.Comparable<T> 1.0 int compareTo(T other) :用這個對象域 與 other 進行比較; [API] java.util.Arrays 1.2 static void sort(Object[] a) : 使用mergesort 對數組a中的元素進行排序; 要求數組中的元素必須實現了 Comparable 接口的類, 并且元素間必須是可 比較的; [API] java.lang.Integer 7 static int compare(int x, int y) : 如果x<y 返回一個負數, 相等返回0, 否則返回一個正數;

Annotation)

  • A1)語言標準規定: 對于任意的x 和 y, 實現必須能夠保證 sgn(x.compareTo(y)) = -sgn(y.compareTo(x)); 這也就是說, 如果y.compareTo(x) 拋出 一個異常,那么 x.compareTo(y) 也應該拋出一個異常;
  • A2)這里的sgn 是一個數值的符號: 如果n為負值, sgn(n) 等于 -1, 如果n是0, sgn(n) 等于0;如果n是正數, sgn(n) 等于1;
  • A3)簡單講, 如果調換compareTo 的參數,結果的符號也應該調換(而不是實際值);

出現的問題)因為 Manager 擴展了 Employee, 而 Employee實現的是Comparable , 而不是 Comparable, 如果 Manager覆蓋了 compareTo, 就必須要有經理 與 雇員進行比較的心理準備, 決不能僅僅將 雇員轉換為 經理;

class Manager extends Employee {public int compareTo(Employee other){Manager otherManger = (Manager)other; //NO......} }
  • P1)這不符合 “反對稱”的規定:如果x是一個 Employee對象, y 是一個 Manager對象, 調用 x.compareTo(y) 不會拋出異常, 它只是將 x 和 y 都作為雇員進行比較。 但是反過來, y.compareTo(x) 將會拋出一個 ClassCastExcaption;

解決辦法(Solutions):

  • S1)如果子類之間的比較含義不一樣, 那就屬于不同類對象 的非法比較, 每個 compareTo 方法都應該在開始時 進行下列檢測:
if(getClass != other.getClass()) throw new ClassCastException();
  • S2)如果存在這樣一種通用算法, 它能夠對兩個不同的子類對象進行比較,則應該在超類中提供一個 compareTo方法, 并將這個方法法聲明為final;
  • S3)假如 不管薪水的多少,都想讓 manager 大于 雇員, 即如果要按照職務排列 的話, 那就應該在 Employee類中 提供一個 rank方法, 每個子類覆蓋rank, 并實現一個 比較 rank值的 compareTo 方法;

【2】 接口的特性

2.1)可以聲明接口變量, 且接口變量必須引用實現了接口的類對象:

Comparable x ; 這是OK 的; x = new Employee();

2.2)可以使用 instanceof 檢查一個對象是否實現了某個特定的接口:

if(anObject instanceof Comparable) {}

2.3)接口也可以繼承, 這里允許存在多條從具有較高通用性接口到較高專用性接口的鏈:看個荔枝

public interface Moveable {void move(double x, double y); } //然后用 Movable 擴展一個 Powered 的接口: public interface Powered extends Moveable {double milesPerGallon(); } //雖然在接口中不能包含實例域或靜態方法, 但可以包含常量: public interface Powered extends Moveable {double milesPerGallon();double SPEED_LIMIT = 95; // a public static final constant }
  • Attention)與接口中的方法都自動被設置為 public, 接口中的 域都被自動設為 public static final
  • Annotation)有些接口只是定義了常量,而沒有定義方法, 這樣應用接口似乎有點偏離了接口概念的初衷,所以, 最好不要這樣用它;

2.4)類是單繼承,但是可以實現多個接口;看個荔枝:
java 中有一個 非常重要的 內置接口, Cloneable, 如果某個類實現了這個Cloneable 接口,Object類中的 clone 方法就可以創建類對象的一個copy, 如果希望自己設計的類擁有 克隆和比較的能力, 只要實現這兩個接口就可以了(一個類可實現多個接口)

class Employee implements Cloneable, Comparable

【3】接口與抽象類

3.1)疑問?為什么java還要不辭辛苦引入接口概念? 為什么不將 Comparable直接設計成抽象類:

abstract class Comparable {public abstract int compareTo(Object obj); } //然后, Employee再擴展這個抽象類, 并提供 compareTo方法的實現: class Employee extends Comprable {public int compareTo(Object other){ ... } }

3.2)使用抽象類表示通用屬性存在這樣一個問題:每個類只能擴展一個類, 假設 Employee 類已經擴展了一個類, 比如Person, 它就不能再像下面這樣擴展第二個類了; 但是每個類可以實現多個接口:

class Employee extends Person implements Comparble //OK

總結

以上是生活随笔為你收集整理的java接口概述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。