Java中的抽象類和接口你瞭解嗎
抽象類
什麼是抽象類?
類和類之間有共同特征,將這些共同特征提取出來進一步抽象,就形成瞭抽象類。由於類是不存在的,所以抽象類無法創建對象。
抽象類屬於什麼類型?
抽象類也屬於引用數據類型。
抽象類怎麼定義?
[修飾符列表] abstract class 類名{ 類體; }
抽象類是幹什麼的?
抽象類無法實例化,無法創建對象,所以抽象類是用來被子類繼承的,抽象類中構造方法可以供子類使用。
final與abstract是對立的兩個關鍵字,不能聯合使用。
什麼是抽象方法?
抽象方法表示沒有實現的方法,沒有方法體的方法。
例如:
public abstract void doSome();
特點一:抽象方法沒有方法體,以分號結尾。
特點二:抽象方法前面的修飾符列表必須有abstract關鍵字。
特點三:抽象類中可以沒有抽象方法,但抽象方法隻能出現在抽象類中和接口中。
易錯:並不是所有沒有方法體的方法都叫做抽象方法!
非抽象類繼承抽象類
以下面代碼為例:
代碼
//抽象類 public abstract class Animal { //抽象方法 public abstract void move(); } //非抽象類繼承抽象類 class Bird extends Animal{ }
這樣寫有問題嗎?有問題!
編譯器會給出以下結果:
抽象方法隻能出現在抽象類中,當Bird類繼承Animal類之後,會將抽象方法也繼承過去,所以我們需要在Bird類中通過重寫的方式將抽象方法實現瞭。
代碼
//抽象類 public abstract class Animal { } //非抽象類繼承抽象類 class Bird extends Animal{ //向上轉型 Animal a = new Bird(); }
這樣寫有問題嗎?沒有問題!
a的類型是Animal,是抽象的,所以這就是面向抽象編程,降低程序的耦合度,提高程序的擴展性。
抽象類總結
- 抽象類通過在class前面加abstract來定義。
- 抽象類是無法實例化的,無法創建對象的,所以抽象類是用來被子類繼承的。
- final與abstract是對立的,不能聯和使用。
- 抽象類子類可以是抽象類,也可以是非抽象類。
- 抽象類雖然無法實例化,但是抽象類有構造方法,可以供子類使用。
- 抽象類中不一定有抽象方法,但是抽象方法隻能出現在抽象類和接口中。
- 抽象方法的定義:public abstract void doSome();
- 一個非抽象類繼承抽象類,必須將抽象類中的抽象方法進行覆蓋。
接口
接口的基礎語法
- 接口也是一個"引用數據類型",編譯之後也會形成一個class字節碼文件。
- 接口是完全抽象的(抽象類是半抽象的)。
- 接口的語法如下:
[修飾符列表] interface 接口名{......}//修飾符列表可以不寫
- 接口支持多繼承,一個接口可以繼承多個接口。
- 接口中隻包含兩部分內容:常量和抽象方法。
- 接口中所有元素都是public修飾的,都是公開的。
- 接口中定義抽象方法時:public abstract修飾符可以省略。
- 接口中定義常量時:public static final修飾符可以省略。
接口的實現
類和類之間存在繼承,接口和類之間存在類似的關系,叫做實現。
接口實現的關鍵字:implements
語法如下:
class A implements B{......}
我們也可以把實現看成一種特殊的繼承(接口和類之間的關系),但是要註意關鍵字的不同。
註意點:
一:實現的關鍵字與繼承不同,是implements。
二:當非抽象類實現接口時,一定要將接口中的抽象方法重寫。
三:在類中實現接口中抽象方法時,修飾符列表不能省略。
四:一個類可以實現多個接口,這樣彌補瞭類和類之間隻存在單繼承的缺陷。
接口和多態聯合使用
接口是完全抽象的,無法實例化,但是接口可以通過實現與多態聯合使用。
如下:
//接口 interface A{ //抽象方法 int add(int a , int b); } //一個類實現瞭接口B class B implements A{ //重寫瞭接口中的抽象方法 public int add(int a , int b){ return a+b; } public static void main(String[] args) { //A接口的引用指向瞭B類的對象 //面向接口編程 A a = new B(); } }
繼承和實現同時出現
extends 和 implements可以同時出現,同時出現時,要將extends寫在前面,inplements寫在後面。
class Animal{ } interface Flyable{ void fly(); } //當繼承和實現同時出現時,繼承寫前面,實現寫後面 class Bird extends Animal implements Flyable{ public void fly(){ System.out.println("Bird學會瞭飛翔!"); } public static void main(String[] args) { Flyable b = new Bird(); b.fly(); } }
接口在開發中的作用
面向接口編程,可以降低程序耦合度,提高程序擴展力,符合ocp開發原則。
任何一個接口都有調用者和實現者,調用者面向接口調用,實現者面向接口編寫實現,接口和多態一起使用可以將調用者和實現者解耦合(切斷二者的關系)。
類型和類型之間的關系
is a:
Cat is a Animal
凡是能滿足 is a 的表示繼承關系,可以讓Cat類繼承Animal類。
has a
Bird has a Wing
凡是能滿足 has a 的表示關聯關系。
管理關系通常以屬性的修飾存在,可以將Wing定義為Bird類中的一個實例變量。
like a
Cook like a Menu
(比較抽象)
凡是能滿足 like a 的表示實現關系,可以用Cook這個類來實現Menu這個接口。
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!