抽象類和抽象方法
貓狗案例 - 貓和狗繼承了動物類
具體的類 和 抽象的類的區別
動物都有吃飯的方法
動物都有睡覺的方法
動物吃什麼
動物怎麼睡覺
動物具體吃什麼 不知道(對於動物這個類而言,就是一個抽象的類)
某一個具體的動物 吃什麼
貓吃魚 狗吃骨頭 羊吃草
狗趴着睡 馬站着睡
動物這個類的睡覺的方法必須由子類動物來實現, 本身不需要實現,把本身不需要實現的方法稱之爲抽象方法
抽象方法 本身不需要 有方法體的方法, 就是抽象方法, 該方法不需要實現,由子類繼承之後,重寫實現
抽象方法所在的類就是抽象類
文具類 (抽象類)
筆
本
鉛筆刀
水果 (抽象類)
蘋果
梨
山竹
抽象語法
public abstract class fruit{
// 抽象方法 (沒有方法體 )
public abstract void eat();
}
特點
- 抽象類不能創建對象, 只能通過繼承關係, 由子類去創建父類對象
- 子類繼承抽象類, 必須重寫父類的所有抽象方法, 除非子類也是抽象類
抽象類和抽象方法關係
抽象方法所在的類 必須是抽象類
抽象類 可以沒有抽象方法
有豪宅的人 一定是有錢人
有錢人 不一定有豪宅
抽象類中是擁有構造方法的
抽象類中可以 有普通屬性,和普通方法
構造是給屬性賦值使用的 , 抽象類有普通屬性, 所以有給這些屬性賦值的構造方法
接口
生活中的接口
鍵盤 鼠標 音響 U盤 是具有USB 功能的 設備
本身都具有自己的父類
鍵盤 繼承 鍵盤類 (外設類) USB的功能 使用接口來描述 (接口也是一個功能)
接口從某種角度上來講, 可以看做是一個特殊的抽象類,但是採用和抽象類完全不同的語法來表示, 兩者的設計理念不同!
接口是功能的拓展
語法
public interface 接口名{
成員屬性;
方法;
}
注意點
1- 和抽象類不同, 使用 interface 定義, 訪問修飾符 必須是public
2- 成員屬性必須是常量
- 成員方法必須是抽象方法
3- 實現接口使用 implements 來實現
4- 一個類可以實現多個接口
案例
// 定義USB 接口
public interface UsbInterface {
// 常量 (默認修飾符 爲 public static final)
double SIZE = 1.5;
// 具體的執行流程
// 成員方法必須是抽象方法 (默認修飾符 public abstract)
void service();
}
public class UDisk implements UsbInterface{
@Override
public void service() {
System.out.println("鏈接USB 接口 開始傳輸數據!");
}
}
/**
* USB 小風扇 實現了 USB的接口
* 必須重寫 接口中的所有抽象方法
*/
public class UsbFan implements UsbInterface{
@Override
public void service() {
System.out.println("鏈接USB 獲取電流 風扇開始轉動!");
}
}
public class Demo {
public static void main(String[] args) {
// 使用父接口 來接收子類對象 , 也是多態的一種實現方式
UsbInterface uDisk = new UDisk();
uDisk.service();
UsbInterface uFan = new UsbFan();
uFan.service();
}
}
接口與類之間的關係
接口和接口之間可以相互繼承
public interface A {
void m1();
}
// 接口之間相互繼承
public interface B extends A{
}
接口與類之間, 多實現
public class C implements A,B{}
在繼承的同時, 實現多個接口
public class D extends C implements A,B {}
類與類之間 相互繼承
接口和抽象類之間的對比
1- 接口是一個特殊的抽象類, 要比抽象類更抽象
2- 屬性和方法
抽象類中可以有非抽象方法, 可以有普通成員屬性
接口中 只有常量,抽象方法
3- 構造
抽象類存在構造方法, 接口中沒有構造方法
4- 編程思想
抽象類 (is a) 是一個 - 貓繼承了動物類, 貓是一個動物
接口 (have a) 有什麼 - 鼠標實現了USB , 鼠標有USB的功能 (功能拓展)
5- 繼承與實現關係
抽象類 繼承關係, 只能單繼承
接口 實現關係, 支持子類多實現
案例
貓狗案例
動物
貓
狗
/***************************************/
動物
會英語的貓
不會英語的貓
會英語的狗
不會英語的狗
接口的優勢
- 可擴展性
- 避免單繼承的弊端
設計原則
- 摘取代碼中變化的行爲, 形成接口
- 多用組合, 少用繼承 (避免代碼冗餘)
- 針對接口編程, 不依賴於具體實現
- 開閉原則, 針對擴展開放,針對修改關閉