Interface 介面和多型
阿新 • • 發佈:2022-05-23
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. 強制型別轉換
大型別 ==> 小型別
格式:
小型別 物件名 = (小型別) 大型別物件;
【重點】:
必須明確大型別物件儲存到底是什麼內容。
後期強制型別轉換需要型別判斷!!!