1. 程式人生 > 其它 >Interface 介面和多型

Interface 介面和多型

1,interface

1.1 介面到底做了什麼???
常見介面:
USB-B USB-C Type-C HDMI VGA DP RJ45 Lighting mirco-usb 3.5MM SATA M.2 SATA PCI-E
電源 電動車插口
介面可以做什麼???
  	USB為例
	滑鼠,鍵盤,音效卡,網絡卡,U盤,行動硬碟,充電,遊戲手柄,藍芽...
可以拓展當前裝置的功能!!!增強功能!!!
1.2 Java 中定義 interface 介面的格式
定義介面關鍵字:
    interface
 格式:
    interface 介面名 {
        成員變數
        成員方法
}

interface A {
/*
 * The blank final field num may not have been initialized
 * final 修飾的成員變數 num 可能尚未初始化。
 * 
 * Outline 提示 num 變數 綠色空心圈 SF 修飾
 * 	綠色空心圈 public
 * 	SF ==> static final 
 * 
 * 介面中成員變數【預設屬性】 public static final
 */
public static final int NUM = 10;

/*
 * Abstract methods do not specify a body
 * abstract修飾方法沒有方法體!!!
 * 
 * 介面中成員方法【預設屬性】 public abstract
 */
void test();
}
1.3 類【遵從】 介面的格式和要求
關鍵字:
    implements
格式:
    class 類名 implements 介面名 {
}
/*
 * The type TypeA must implement the inherited abstract method A.test()
 * TypeA 必須實現 遵從 介面 A 得到 abstract 方法 
 * 
 * @Override
 * 		開啟程式碼格式嚴格檢查!!!要求 TypeA 類中的 test 方法必須和介面 A 中的 test 方法宣告一致
 */
class TypeA implements A {

@Override
public void test() {
	System.out.println("TypeA 類遵從介面 A 實現 test 方法");
    }

}

public class Demo1 {
public static void main(String[] args) {
	TypeA typeA = new TypeA();
	
	typeA.test();
	
	// 介面 A 有自己的 類物件嗎???
    }
}
1.4 介面的特殊語法
1.4.1 JDK 1.8新特徵
default 關鍵字
default 關鍵字可以在介面中修飾方法,該方法為預設方法!!!
interface B {
void test();

/*
 * This method requires a body instead of a semicolon
 * 該方法需要一個方法體來替換 分號
 * 
 * default 修飾介面中的方法可以有方法體,為預設方法,【預設屬性】 public
 */
default void testDefault() {
	System.out.println("default 修飾的預設方法");
    }
}

class TypeB implements B {

/*
 * 藍紫色空心箭頭
 * implements com.qfedu.a_interface.B.test
 * 實現 介面 B 中的 test 方法
 */
@Override
public void test() {
	System.out.println("遵從介面 B 實現  test 方法");
}

/*
 * 綠色實心箭頭
 * overrides com.qfedu.a_interface.B.testDefault
 * 重寫 介面 B 中的 testDefault 方法
 */
/*
 * Default methods are allowed only in interfaces.
 * default 修飾方法有且只允許在介面中存在
 */
@Override
public void testDefault() {
	System.out.println("測試");
    }

}

public class Demo2 {
public static void main(String[] args) {
	TypeB typeB = new TypeB();
	typeB.test();
	typeB.testDefault();
    }
}
1.4.2 類可以同時遵從多個介面
interface C {
void testC();
}

interface D {
void testD();
}

/**
 * 一個類可以同時遵從多個介面,不同的介面使用逗號隔開.
 * @author Anonymous
 *
 */
class TypeC implements C, D {

@Override
public void testD() {
	System.out.println("遵從介面 D 實現 testD 方法");
    }

@Override
public void testC() {
	System.out.println("遵從介面 C 實現 testC 方法");
    }

}
1.4.3 介面繼承
關鍵字 extends
interface E {
void testE();
}

interface F {
void testF();
}

 interface G {
void testG();

}

/*
 * USB介面多繼承其他介面,為什麼不需要使用其他介面中的預設屬性為 public abstract 修飾方法???
 * 		abstract修飾方法,可以存在於 abstract 修飾類內 和 interface 介面內。
 * 		USB 介面繼承多個介面,當前 USB 介面可以作為父介面 abstract 存在環境。
 */
interface USB extends E, F, G {
void usbConnect();
}

/*
 * 一個非 abstract 修飾類,遵從介面,要求實現介面中所有尚未實現的 abstract 方法,
 * 如果當前介面有父介面,當前類需要同時將父介面中的 abstract 一併實現。
 */
class TypeD implements USB {

@Override
public void testE() {
	System.out.println("E方法");
    }

@Override
public void testF() {
	System.out.println("F方法");
    }

@Override
public void testG() {
	System.out.println("G方法");
    }

@Override
public void usbConnect() {
	System.out.println("usbConnect方法");		
    }

}

2. 生活例項分析

2.1 動物園
動物是不是一個類???
是
老虎算不算一個類???

熊貓算不算一個類???
猴子算不算一個類???

老虎 熊貓 猴子 算不算動物???

你去動物園餵動物!
喂熊貓算不算???
喂老虎算不算???
喂猴子算不算???
	算

總結:
1. 方法引數所需型別為父類型別,這裡可以傳入父類物件本身或者其子類物件,還可以是間接子類物件。
2. 方法返回值型別為父類型別,這裡可以返回值的實際物件可以是父類物件本身或者其子類物件,還可以是間接子類物件
3. 資料型別強制轉換,是從大型別 ==> 小型別。要求資料的真實情況和目標轉換的小型別一致。
	引用資料型別強制轉換,型別沒有問題的情況下,不存在資料精度丟失,資料空間丟失,對於後期操作有利。

3.多型總結

1. 拓寬方法的引數範圍:
方法所需引數為父類型別,可以傳入其父類物件本身,直接子類物件或者間接子類物件。
方法所需引數為介面型別,要求傳入的實際引數是介面實現類物件或者間接實現類物件

2. 拓寬方法的返回值資料範圍
方法返回值型別是父類型別,可以返回父類物件本身,直接子類物件或者間接子類物件
方法返回值型別是介面型別,可以返回介面的實現類物件或者間接實現類物件,後期極為常見!!!
	interface java.sql.Connection  資料連線物件
	interface java.sql.PreparedStatement 	 資料庫 SQL 語句預處理搬運工物件。

3. 強制型別轉換
大型別 ==> 小型別
格式:
	小型別 物件名 = (小型別) 大型別物件;
【重點】:
	必須明確大型別物件儲存到底是什麼內容。
	後期強制型別轉換需要型別判斷!!!