1. 程式人生 > >java面向物件 介面

java面向物件 介面

1.1 介面概念

介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。
介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)
來完成。這樣將功能的定義與實現分離,優化了程式設計。
請記住:一切事物均有功能,即一切事物均有介面;

1.2介面的定義

與定義類的 class 不同,介面定義時需要使用 interface 關鍵字。
定義介面所在的仍為.java 檔案,雖然宣告時使用的為 interface 關鍵字的編譯後仍然會產生.class 檔案。這
點可以讓我們將介面看做是一種只包含了功能宣告的特殊類。
定義格式

public interface 介面名 {
抽象方法 1;
抽象方法 2;
抽象方法 3;
}

使用 interface 代替了原來的 class,其他步驟與定義類相同:
⚫ 介面中的方法均為公共訪問的抽象方法
⚫ 介面中無法定義普通的成員變數 

1.3 類實現介面

類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用
implements。
其他類(實現類)實現介面後,就相當於宣告:”我應該具備這個介面中的功能”。實現類仍然需要重寫
方法以實現具體的功能。
格式 

class 類 implements 介面 {
重寫介面中方法
}

 

在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具
體的邏輯。

⚫ 介面中定義功能,當需要具有該功能時,可以讓類實現該介面,只聲明瞭應該具備該方法,是
功能的宣告。
⚫ 在具體實現類中重寫方法,實現功能,是方法的具體實現。
於是,通過以上兩個動作將功能的宣告與實現便分開了。(此時請重新思考:類是現實事物的描述,
介面是功能的集合。)

1.4 介面中成員的特點


1、介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數
也稱之為常量,其值不能改變。
2、介面中可以定義方法,方法也有固定的修飾符,public abstract
3、介面不可以建立物件。
4、子類必須覆蓋掉介面中所有的抽象方法後,子類才可以例項化。否則子類是一個抽象類。

interface Demo { /// 定義一個名稱為 Demo 的介面。
	public static final int NUM = 3;// NUM 的值不能改變

	public abstract void show1();

	public abstract void show2();
}

//定義子類去覆蓋介面中的方法。類與介面之間的關係是 實現。通過 關鍵字 implements
class DemoImpl implements Demo { // 子類實現 Demo 介面。
//重寫介面中的方法。
	public void show1() {
	}

	public void show2() {
	}
}

1.5 介面的多實現

瞭解了介面的特點後,那麼想想為什麼要定義介面,使用抽象類描述也沒有問題,介面到底有啥用
呢?
介面最重要的體現:解決多繼承的弊端。將多繼承這種機制在 java 中通過多實現完成了

interface Fu1 {
	void show1();
}

interface Fu2 {
	void show2();
}

class Zi implements Fu1, Fu2// 多實現。同時實現多個介面。

{
	public void show1() {
	}

	public void show2() {
	}
}

 

怎麼解決多繼承的弊端呢?
弊端:多繼承時,當多個父類中有相同功能時,子類呼叫會產生不確定性。
其實核心原因就是在於多繼承父類中功能有主體,而導致呼叫執行時,不確定執行哪個主體內容。
為什麼多實現能解決了呢?
因為介面中的功能都沒有方法體,由子類來明確。

 

1.6 類繼承類同時實現介面


介面和類之間可以通過實現產生關係,同時也學習了類與類之間可以通過繼承產生關係。當一個類
已經繼承了一個父類,它又需要擴充套件額外的功能,這時介面就派上用場了。
子類通過繼承父類擴充套件功能,通過繼承擴充套件的功能都是子類應該具備的基礎功能。如果子類想要繼
續擴充套件其他類中的功能呢?這時通過實現介面來完成

class Fu {
	public void show() {
	}
}

interface Inter {
pulbic abstract void show1();
}

class Zi extends Fu implements Inter {
	public void show1() {
	}
}

介面的出現避免了單繼承的侷限性。父類中定義的事物的基本功能。介面中定義的事物的擴充套件功能

1.7 介面的多繼承


學習類的時候,知道類與類之間可以通過繼承產生關係,介面和類之間可以通過實現產生關係,那
麼介面與介面之間會有什麼關係。
多個介面之間可以使用 extends 進行繼承

interface Fu1{
void show();
}

interface Fu2{
void show1();
}

interface Fu3{
void show2();
}

interface Zi extends Fu1,Fu2,Fu3{
void show3();
}

在開發中如果多個介面中存在相同方法,這時若有個類實現了這些介面,那麼就要實現介面中的方
法,由於介面中的方法是抽象方法,子類實現後也不會發生呼叫的不確定性。

1.8 介面的思想

前面學習了介面的程式碼體現,現在來學習介面的思想,接下里從生活中的例子進行說明。
舉例:我們都知道電腦上留有很多個插口,而這些插口可以插入相應的裝置,這些裝置為什麼能插
在上面呢?主要原因是這些裝置在生產的時候符合了這個插口的使用規則,否則將無法插入介面中,更
無法使用。發現這個插口的出現讓我們使用更多的裝置。

總結:介面在開發中的它好處
1、介面的出現擴充套件了功能。
2、介面其實就是暴漏出來的規則。
3、介面的出現降低了耦合性,即裝置與裝置之間實現瞭解耦

1.9 介面和抽象的區別

明白了介面思想和介面的用法後,介面和抽象類的區別是什麼呢?介面在生活體現也基本掌握,那
在程式中介面是如何體現的呢?
通過例項進行分析和程式碼演示抽象類和介面的用法

1、舉例:
犬:
     行為:
     吼叫;
     吃飯;
緝毒犬:
    行為:
    吼叫;
    吃飯;
    緝毒;
2、思考:

由於犬分為很多種類,他們吼叫和吃飯的方式不一樣,在描述的時候不能具體化,也就是吼叫和吃
飯的行為不能明確。當描述行為時,行為的具體動作不能明確,這時,可以將這個行為寫為抽象行為,
那麼這個類也就是抽象類。
可是當緝毒犬有其他額外功能時,而這個功能並不在這個事物的體系中。這時可以讓緝毒犬具備犬
科自身特點的同時也有其他額外功能,可以將這個額外功能定義介面中。

 3、通過上面的例子總結介面和抽象類的區別:
相同點:
⚫ 都位於繼承的頂端,用於被其他類實現或繼承;
⚫ 都不能直接例項化物件;
⚫ 都包含抽象方法,其子類都必須覆寫這些抽象方法;

區別:
⚫ 抽象類為部分方法提供實現,避免子類重複實現這些方法,提高程式碼重用性;介面只能包含抽象
方法;
⚫ 一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個介面;(介面彌補了 Java 的單繼
承)
⚫ 抽象類是這個事物中應該具備的你內容, 繼承體系是一種 is..a 關係
⚫ 介面是這個事物中的額外內容,繼承體系是一種 like..a 關係
二者的選用:
⚫ 優先選用介面,儘量少用抽象類;

⚫ 需要定義子類的行為,又要為子類提供共性功能時才選用抽象類