天天看點

抽象類與接口1. 抽象類2. 接口3. 關系總結4. 抽象類和接口的差別

1. 抽象類

1.1 概念

首先,抽象類就是一個不具體的類。 随着繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共享特征。有時将一個父類設計得非常抽象,以至于它沒 有具體的執行個體,這樣的類叫做抽象類。 

在Java中,一個沒有方法體的方法應該定義為抽象方法,而類中如果有抽象方法,該類必須定義為抽象類。

1.2 抽象類特點

1.2.1 抽象類和抽象方法必須要用abstract關鍵字修飾:

抽象類預設的修飾符是:public abstract 

抽象方法的預設修飾符是:pubic abstract 

抽象類裡面屬性預設修飾符是:public static final

  • public abstract class ClassName{}
  • public abstract void Method();
  • public static final int PI = 3.14;

1.2.2 抽象類不一定有抽象方法,有抽象方法的類一定是抽象類。

1.2.3 抽象類的子類要麼是抽象類,要麼實作所有的抽象方法。

1.2.4 抽象類可以繼承,但不能被執行個體化,隻能由具體的子類執行個體化(屬于多态的一種,抽象類多态)。

1.2.5 抽象類與final類相反,final類不可以繼承,可以執行個體化。

1.3 抽象類的成員特點

1.3.1 抽象類的成員變量可以是常量,也可以是變量。

1.3.2 抽象類雖然不能執行個體化,但它有構造方法(所有類都有構造方法),其構造方法的主要用于子類通路父類資料的初始化。

1.3.3 成員方法可以有抽象方法,先定子類必須實作;也可以有非抽象方法,提高代碼的複用性。

1.4 抽象類與普通類

相同點: 

  • 抽象類和一般類都是用來描述事物的,都在内部定了成員。 

不同: 

  • 一般類有足夠的資訊描述事物;抽象類描述事物的資訊有可能不足。 
  • 一般類中不能定義抽象方法,隻能定非抽象方法;抽象類中可定義抽象方法,同時也 可以定義非抽象方法。
  • 一般類可以被執行個體化;抽象類不可以被執行個體化。 

注意: 

  • 不能用 abstract 修飾屬性、私有方法、構造器、靜态方法、final 的方法 

2. 接口

2.1 概念

接口(interface)是抽象方法和常量值的定義的集合。

從本質上講,接口是一種特殊的抽象類,這種抽象類中隻包含常量和方法的定義,而沒有變量和方法的實作。

2.2 接口的特點

2.2.1 接口用關鍵字interface表示,interface 接口名 {} 

2.2.2 類實作接口用implements表示,class 類名 implements 接口名 {} 

2.2.3 接口沒有構造方法,不能執行個體化。按照多态的方式,由具體的實作類執行個體化。(接口多态)

2.2.4 接口的子類要麼是抽象類要麼重寫接口中的所有方法。

2.2.5 接口之間可以互相繼承,并且支援多繼承。

2.2.6 接口中的所有成員變量都預設是由 public static final 修飾的(固定的)。 

2.2.7 接口中的所有方法都預設是由 public abstract 修飾的(固定的)。

2.2.8 由以上兩點可知:接口中的成員都是公共的權限 

2.3 接口成員特點

2.3.1 成員變量:隻能是常量 ,預設修飾符 public static final。

2.3.2 構造方法:沒有構造方法,因為接口主要是擴充功能的,而沒有具體存在。

2.3.3 成員方法:隻能是抽象方法,預設修飾符 public abstract。

3. 關系總結

類與類:繼承關系,隻能單繼承,但是可以多層繼承。

類與接口:實作關系,可以單實作,也可以多實作。還可以在繼承類的同時實作一個或多個接口。

接口與接口:繼承關系,可以單繼承,也可以多繼承。

4. 抽象類和接口的差別

4.1 成員差別

抽象類:包含變量,常量,抽象方法,非抽象方法。

接口:包含常量,抽象方法。

4.2 關系差別

類與類:繼承,單繼承。

類與接口:實作,支援多實作。

接口與接口:繼承,支援多繼承。

4.3 設計理念差別

抽象類:被繼承展現的是 " is a " 關系,共性功能。

接口:被實作展現的是 " like a " 關系,拓展功能。

4.4 相同點

接口和抽象類都不能被執行個體化。隻能被其他類實作和繼承。 

接口和抽象類都可以包含抽象方法,實作接口和抽象類的類都必須實作這些抽象方法,否則實作的類就是抽象類。 

4.5 不同點

抽象類與接口定義不同:抽象類 abstract class,接口  interface。

接口裡隻能包含抽象方法,不包含已經實作的方法;抽象類則完全可以包含普通的方法。 

接口裡不能定義靜态方法;抽象類可以定義靜态方法。

接口裡隻能定義靜态常量屬性,不能定義普通屬性;抽象類裡既可以定義普通屬性, 也可以定義靜态常量。

接口不包含構造函數;抽象類包含構造函數,抽象類裡的構造函數并不是用于建立對象,而是讓其子類調用這些構造函數來完成屬于抽象類的初始化操作。

接口不包含初始化塊,但抽象類可以包含初始化塊 

一個類最多隻能有一個直接父類,包括抽象類;但一個類可以直接實作多個接口,通過實作多個接口以彌補 Java 單繼承的不足。

抽象類與接口1. 抽象類2. 接口3. 關系總結4. 抽象類和接口的差別

注意:在開發中,一個類不要去繼承一個已經實作好的類,要麼繼承抽象類,要麼實作接口 

通過接口可以實作不相關類的相同行為,而不需要考慮這些類之間的層次關系。 

通過接口可以指明多個類需要實作的方法,一般用于定義對象的擴張功能。 

接口主要用來定義規範。解除耦合關系。