1. 程式人生 > >java中介面與抽象類異同點與在專案中的應用

java中介面與抽象類異同點與在專案中的應用

1包
	作用: 管理類
	定義: package  包名;
		package必須作為原始檔 的第一條語句
		包名的命名規則
	使用其他包中的類
		完整類名
		先import匯入類,再使用
2 Eclipse
3 訪問許可權
	類的訪問許可權: 公共類, 非公共類
		公共類的應用場景, 想讓其他包中的類使用
	類成員的訪問許可權
		私有的,private, 
		預設的
		受保護的,protected
		公共的,public
		使用時,遵循訪問許可權最小化原則
4Object
	所有類的根父類
	Java類的繼承是可傳遞的
	clone() ,  finalize() ,  notify()/wait(),  
	getClass(), 判斷兩個物件的型別是否一樣
	toString(), 把物件轉換為字串, 預設是: 完整類名@雜湊碼的十六進位制
		System.out.println()列印物件時會呼叫物件的toString(), 想列印物件時,顯示物件的欄位值,需要重寫toString()
	equals(), 判斷堆中物件的 內容是否一樣
		==判斷兩個變數的值是否相同, 如果兩個引用型別變數==相等,說明這兩個引用指向堆中同一個物件.
		根據雜湊約定,如果兩個物件equals()相等,這兩個物件的hashCode也應該一樣

1 final關鍵字
final關鍵字可以修飾類, 修飾成員變數,修飾方法, 修飾區域性變數, 修飾方法的形參

final修飾類, 表示最終類, 不能被繼承
final修飾字段,在定義時必須初始化, 不能被修改, 一般與static同時使用稱為final常量, 所有字母都大寫
final修飾方法,不能被重寫, 在子類中不能定義相同簽名的方法
final修飾區域性變數, 一旦初始化就不能再修改, final修飾引用型別變數,是指這個引用不能再指向其他物件,可以修改它的屬性值
final修飾方法的形參, 在方法體中不能對final形參賦值

2 抽象方法與抽象類
2.1 抽象方法
可以把所有的矩形抽象為矩形 類, 把所有的圓形抽象為圓形類, 把所有的三角形抽象為三角形類, 進一步把所有的平面圖形抽象類平面圖形類.
平面圖形有求面積,求周長的操作, 但是不同的圖形具體的實現不一樣, 在平面圖形類中, 這兩個操作沒法具體實現.
當一個類的某個操作沒法具體實現時,這個操作可以定義為抽象方法

語法:
[方法修飾符] abstract 返回值型別 方法名(引數列表) ;
只有方法的宣告沒有方法體
含有抽象方法的類必須定義為抽象類

2.2 抽象類
1) 使用abstract修飾的類就是 抽象類
2) 含有抽象方法的類必須定義為抽象類, 但是抽象類中不一定含有抽象方法
即抽象類中可能沒有抽象方法
有時,對現有的類進一步抽象,可以形成更高層級的類, 對小狗,小貓,人, 進一步抽象為動物類, 動物類一般作為其他類的父類存在, 不需要對動物類進行例項化, 可以把動物類定義為抽象類
3) 抽象類不能例項化物件(語法), 抽象類中肯定含有構造方法, 子類建立物件執行子類構造方法,在子類構造方法執行前,會先呼叫父類的構造方法,預設呼叫父類的無參構造(super()).
4) final與abstract同時使用
3 介面
3.1 概述
電腦上有哪些介面?
USB介面, 電源介面, 耳機介面, 網線介面, Type-C介面, VGA介面, HDMI高清介面, Thunder介面

1)電腦介面的作用?
	電腦通過這些介面連線外設, 擴充套件了電腦的功能
	電腦有這個介面,可以連線這個介面對應的外設,沒有這個介面不具備這個功能
2)電腦上介面的生產廠商和介面連線裝置的廠商是同一家嗎?
	電腦可以連線各種USB裝置, 這些USB裝置可能是由若干不同廠商生產的
3) 為什麼不同廠商生產的USB裝置,插到電腦上就能用??
	使用相同的標準
	usb3.1插槽, 插入USB2.0的裝置, 傳輸速度不是3.1傳輸速度, 因為它們的協議不同
	USB介面,可以理解為一個協議,一個標準


java中的介面的作用:
  1. 使用介面擴充套件類的功能
  2. 使用介面可以定義一組操作規範,或者理解為一個協議

如何定義介面
[修飾符] interface 介面名 {
功能, 用方法表示,預設方法使用public abstract修飾
}
可以把介面簡單的理解為功能的封裝

如何使用介面
	class  類名  implements  介面名 {
重寫介面中的抽象方法, 具有了介面中定義的功能

}

說明:
  1. 介面中方法預設使用public abstract修飾
  2. 類實現了介面,需要重寫介面中的抽象方法,如果沒有重寫所有的抽象方法,類也需要定義為抽象類
  3. 一個類在繼承父類的同時,可以實現多個介面, 需要重寫所有介面的所有抽象方法
  4. 介面也能繼承,並且支援多繼承
  5. 介面(JDK8)中的內容除了抽象方法外,還可以定義public static final常量 , public static靜態方法, 和public default方法
  6. 在開發時, 介面中一般只定義public abstract預設方法, 和public static final常量 ; 如果對已有的專案進行升級, 可能會定義public static方法或者 public default方法
  7. Java的引用資料型別: 類, 介面, 陣列, 列舉. 介面也是一種引用資料型別, 介面可以定義變數, 但是介面不能例項化物件, 介面沒有構造方法
  8. 介面的引用需要賦值實現類物件, 通過介面引用呼叫介面中定義的抽象方法, 實際上執行的是實現類物件的方法, 這是介面多型

3.2 抽象類與介面的異同點
相同點:
1)都可以定義抽象方法
2)都不能例項化物件
3)都可以定義public static final常量 , public static方法
4)定義的抽象方法需要被重寫
不同點:

  1. 定義方式不同
    抽象類使用 abstract class 定義
    介面使用 interface定義
  2. 內容不同
    抽象類中除了抽象方法外, 還有構造方法等普通類有的所有成員
    介面中除了抽象方法外, 可以定義default修飾的方法, 沒有構造方法
  3. 使用方式不同
    抽象類一般作為其他類的父類存在, 需要被extends繼承
    介面需要類通過implements實現
  4. 類只支援單繼承, 介面可以支援多繼承
  5. 應用場景不同
    如果僅僅是為了 擴充套件類的功能, 優先選擇使用介面
    抽象類可以描述類之間的層次關係; 如果除了功能擴充套件外,還需要儲存資料選擇抽象類; 抽象類可以約束所有的子類都具有某個功能.

3.3 介面的應用
3.3.1 封裝功能
可以把介面簡單的理解為對功能的封裝.
如:
定義Flyable介面,封裝了一個fly()飛行的操作, 如果某個類想有飛行的操作就實現該介面
定義了Swimmable介面, 封裝了一個swim()游泳的操作, 如果某個 類實現了該介面,具有了游泳的功能

3.3.2 介面從某種程度上可以解決類的多繼承問題
例:
描述打工的學生, 可以讓打工的學生類繼承學生類, 把打工這個操作定義為一個介面,

描述帶橡皮的鉛筆

3.3.3 介面可以定義一組操作規範
如 在開發百度新聞時, 有若干的模組, 可以把對新聞的操作定義為一個介面, 所有的模組都實現該介面, 這樣就實現了所有模組操作的統一
interface NewsDao {
void addNews();
void deleteNews();
void updateNews();
void listAllNews();
}
所有新聞模組都要實現NewsDao介面, 這樣就實現了所有模組操作的統一
這一組操作規範,也可以理解為一個標準,一個協議.

3.4 提倡面向介面的程式設計
3.4.1 介面比較靈活
一個類在繼承父類的同時, 可以實現多個介面, 擴充套件了類的多個功能
就像電腦有很多的介面, 電腦可以連線很多的外設, 擴充套件了電腦的多個功能

3.4.2 介面比較容易擴充套件
介面的引用作為方法的形參, 呼叫方法時, 可以傳遞各種實現類物件
對於這個方法來說,具有較高的擴充套件性/通用性

有時介面型別作為方法的返回值型別, 實際上返回的是各種實現類物件

3.4.3 介面可以使專案分層

通過介面把專案簡單的分為兩層:
	有一組開發人員負責開發業務邏輯模組, 這些開發人員 不需要精通資料庫的操作
	有一組開發人員負責開發資料庫的實現類, 他們需要精通資料庫的操作, 不關心業務邏輯是什麼

總結:

  1. final關鍵字, 修飾類/欄位/方法/區域性變數/方法形參
  2. 抽象方法與抽象類
    為什麼定義抽象方法? 如何定義抽象方法??
    如何定義抽象類? 如何使用抽象類??
    注意:
    抽象類不能例項化物件, 肯定有構造方法,
    含有抽象方法的類必須定義為抽象類, 抽象類中不一定含有抽象方法
  3. 介面
    介面的定義, interface
    介面的使用, implements
    注意:
  1. 介面中方法預設使用public abstract修飾

  2. 類實現了介面,需要重寫介面中所有的抽象方法,如果沒有重寫所有抽象方法,這個類也需要定義為抽象類

  3. 介面支援多繼承

  4. 一個類在繼承父類的同時,可以實現多個介面,

  5. 介面是一種引用資料型別, 介面引用賦值實現類物件, 通過介面引用呼叫介面中的抽象方法,實際上執行的是實現類物件的方法, 這是介面多型. 介面存在的意義就是為了實現多型

  6. 介面的內容只有四部分(JDK8): public abstract方法, public static final常量, public static方法, public default方法
    抽象類與介面的異同點
    相同
    不同
    介面的應用:
    使用介面來封裝某個功能
    介面可以部分解決類的多繼承問題
    通過介面定義一組操作規範
    提倡面向介面的程式設計
    介面比較靈活
    比較容易擴充套件
    可以使專案分層

    4程式碼:

  7. 列印各種平面圖形的面積與周長

  8. 憤怒的小鳥

  9. 主人餵養寵物

  10. 計算出租車租金

  11. 介面的定義與實現
    飛行介面, 小鳥, 飛機…會飛, 彈弓類可以彈射會飛的物體
    游泳介面, 游泳池只接收會游泳的動物來游泳
    打工的學生/ 帶橡皮的鉛筆

  12. 看懂介面使專案分層的程式碼

    618年中大促, 不同的商品打折方式不一樣, 有九折,8折,7折, 滿減, 滿返. 打折方式可以定義為一個介面, 商品都有自己的打折方式, 商品有計算折扣後的價格

    描述每種動物都有自己的說話方式