從零開始的Java程式設計之抽象與介面
一、抽象類:
定義抽象方法:
- [修飾符] abstract 返回值型別 方法名([引數列表]); //抽象方法
-
概念:
抽象類和具體類是相對概念,
抽象
是一種存在思想邏輯中的概念,而具體
是一種可見可觸控的現實物件。比如說,人
比男人
抽象一點,生物
比人
更抽象。抽象的概念是由具體概念依其共性而產生的,把具體概念的諸多個性排除,集中的描述其共性,就會產生一個抽象的概念。
抽象高於具體,但是需要具體來實現抽象。
抽象的外延伸大,內涵小,而具體的外延小,內涵大。
-
抽象類與普通類:
普通類可以例項化呼叫;抽象類不能被例項化。因為它是一種概念而不是具體。
普通類和抽象類都可以被繼承,但抽象類被繼承後,需要子類重寫繼承的方法。除非子類也是抽象類。
演示:
public class pet{ public void play(){} // Pet類,普通父類,方法裡是空的 } ---------------------- public class Cat extends Pet{ // 貓類子類,重寫父類方法 public void play(){ System.out.println("1、貓爬樹"); } } ---------------------- public class Dog extends Pet { //這是子類,是一個狗類,重寫了父類方法 public void play(){ System.out.println("2、狗啃骨頭"); } } ---------------------- public class Test { public static void main(String[] args) { //這是測試類,分別呼叫了子類的不同方法 Pet p1=new Cat(); //多典型的多型表現 Pet p2=new Dog(); p1.play(); p2.play(); } } ---------------------- 輸出結果: 1、貓爬樹 2、狗啃骨頭 ---------------------- //抽象方法 public abstract class Pet{ //抽象方法 public abstract void run();//沒有方法體,沒有大括號 }
上述程式碼若改成抽象父類,其子類的寫法依舊不變,那麼抽象類的存在意義是什麼?
抽象類就是為了強制不能例項化,定義一種規則。
-
抽象類的特點:
- 抽象類,抽象方法有 abstract 修飾
- 抽象方法沒有方法體
- 抽象方法不能執行
- 抽象方法不能用private修飾
- 抽象類中可以有普通方法
- 如果一個類繼承了抽象類,那這個類必須重寫它的抽象方法或者將類宣告為抽象類
- 抽象類是有構造方法的,但是不能被例項化
- 構造方法,類方法(static)不能宣告為抽象方法
- 一個類中只要含有抽象方法,這個類就必須是抽象類;抽象類不一定含有抽象方法
若抽象類中有非抽象方法,繼承這個抽象類中的子類可以直接使用此非抽象方法(前提是能訪問到)
二、介面
定義介面
[修飾符] interface 介面名{} public interfacae USB{ public static final name = ""; //靜態常量 public void service(); }
介面中的方法預設是抽象方法,所以省略abstract修飾符
介面中的方法預設都是public,所以可以省略public
介面中的變數只能是靜態常量(static final),所以可以省略 static final,靜態常量在定義時就需要賦值,且不可變
介面使用和抽象類一樣,都是通過子類
一個類可以實現多個介面,介面之間使用 , 隔開
介面的實現類中,可以有普通方法
實現的方法必須是 public 的
java 中繼承是單繼承,使用 extends 關鍵字;但是一個類可以實現多個介面,使用 implements ,多個 介面之間用 , 隔開。
一個類可以同時繼承和實現介面, extends 要在 implements 之前
public class LenovoComputer extends Computer implements USBInterface, ChargeInterface{ }
介面與介面之間是繼承關係,使用 extends 關鍵字。多個介面使用 , 隔開
public interface USBC extends USBInterface,ChargeInterface{ }
jdk8介面新特性
靜態方法必須寫方法體,jdk1.8新增,default修飾符修飾的方法要加方法體,不寫修飾符預設是public,所以要寫方法體的話必須加static
public interface USBInterface { public static void test1() { System.out.println("test1"); } }
三、抽象類與介面
-
概念:
介面是對動作的抽象,抽象類是對本質的抽象
抽象類表示的是,這個物件是什麼,介面表示的是,這個物件能做什麼。比如男人和女人,他們的抽象類是人類,而貓和狗的抽象類是寵物類。人類可以吃東西,寵物類也可以吃東西,但是兩者不能混為一談,因為有本質上的區別。吃東西是一個動作,你可以把吃東西定義為一個介面,然後讓兩個類去實現他。
所以,在高階語言上,一個類只能繼承一個類或抽象類,正如人不可能同時是動物類又是植物類,但是可以實現多個介面,例如,吃飯介面、呼吸介面等
-
使用情況
- 抽象類 和 介面 都是用來抽象具體物件,但是介面的抽象級別最高。
- 抽象類可以有具體的方法和屬性,介面只能有抽象方法和不可變常量(final)。
- 抽象類主要用來抽象類別,介面主要用來抽象功能。
- 抽象類中不包含任何實現,派生類必須覆蓋它們。介面中所有方法都必須是未實現的(static修飾的除外,可以有方法體)。
- 抽象類實現介面時,介面的方法在抽象類中可以被實現也可以不被實現,而普通實現介面必須實現所有介面方法。
- 當你關注一個事物的本質的時候,用抽象類。
- 當你關注一個操作的時候,用介面。
四、總結:
抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度的。
相關文章
- FPGA程式設計從零開始 使用VerilogFPGA程式設計
- Java中的介面與抽象類設計原則Java抽象
- Photon物聯網程式設計從零開始程式設計
- 面向介面程式設計實踐之aspnetcoreapi的抽象程式設計NetCoreAPI抽象
- java從零開始系列-一個前端程式設計師的自我修養Java前端程式設計師
- 風變程式設計,幫助你從零開始學習程式設計程式設計
- 併發程式設計從零開始(十一)-Atomic類程式設計
- 併發程式設計從零開始(九)-ConcurrentSkipListMap&Set程式設計
- 併發程式設計從零開始(十四)-Executors工具類程式設計
- 從零開始理解 Laravel 的設計哲學Laravel
- 從零開始設計一個部落格
- OpenSNN推文:從零開始學程式設計 新手小白的全面指南程式設計
- Java 介面與抽象方法Java抽象
- java中的抽象類與介面Java抽象
- Java的抽象類與介面理解Java抽象
- 從零開始學golang之TCPGolangTCP
- 從零開始的Java RASP實現(二)Java
- 從零開始的Java RASP實現(一)Java
- Arduino程式設計從零開始 使用C和C++(第2版)UI程式設計C++
- flutter之從零開始搭建(一)之 BottomNavigationBarFlutterNavigation
- 從零開始學設計模式(七)—橋接模式設計模式橋接
- Java 併發程式設計之 Condition 介面Java程式設計
- 教你如何從零開始設計電商商品的主圖!
- 從零開始
- 好程式設計師Python教程從零開始學Python系列-第2講程式設計師Python
- 學習程式設計從遊戲開始程式設計遊戲
- Java總結-抽象類與介面Java抽象
- 不怕從零開始,只怕從未開始!
- Java中的介面與抽象類詳解Java抽象
- flutter之從零開始搭建(二)之 Navigator路由Flutter路由
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 從零開始學Java,如何拿高工資?Java
- 從零開始入門 K8s | Kubernetes API 程式設計正規化K8SAPI程式設計
- Java的抽象類 & 介面Java抽象
- 從零開始仿寫一個B站客戶端之抓包介面客戶端
- 【FFmpeg筆記】 從零開始之濾鏡筆記
- java 設計模式6原則 介面,抽象類區別Java設計模式抽象
- uni-app 小程式從零開始的開發流程APP