java基礎——抽象類和接口

抽象類:

如果自下向上的在類的繼承層次結構中上移(繼承層次結構中父類在上,子類在下),位於上層的類更具有通用性,也更加抽象,因此,java中有一種類不能實例化對象,只能被子類繼承,這樣的類就是抽象類。

抽象方法是隻定義,但沒實現的方法,例如:

public void getName();//注意這裡的分號。

抽象類中可以沒有抽象方法,但是一個類只要有一個抽象方法這個類就是抽象類。

抽象方法和抽象類通過”abstract”關鍵字定義,例如:

抽象類:public abstract class Person {}

抽象方法:public abstract void getName() ;

抽象方法充當著佔位的作用,它的具體實現在子類中。一個子類繼承一個抽象類有兩種情況:

  1. 一種是在子類中沒有實現全部的父類的抽象方法,這樣子類也是一個抽象類,必須用“abstract”關鍵字。

  2. 另一種是實現全部的父類的抽象方法,這樣子類就不是抽象的。

注意:可以定義一個抽象類的引用,但必須指向實現了所有抽象方法的子類

接口:

接口不是類,而是對類的一組需求描述。

接口中的方法只定義不實現(後來可以實現靜態方法),接口中不能包含普通域(可以包含靜態常量)。

接口中的方法自動的設置為public,接口中的域自動設置為public static final。

定義一個接口:

public interface Person { String getName();}

一個類實現一個接口:

class Student implements Person{ string name; String getName() { return name; }}

一個類實現一個接口需要兩個步驟:

  1. 實現接口中的所有方法

因為接口並不是類,接口也不可以實例化,這樣一看你可能會感覺接口和抽象類沒什麼區別,但是一個類可以實現多個接口,只能繼承一個父類,通過接口,java間接的實現了多重繼承。

java se8之後可以在接口中實現靜態方法。

可以為接口方法提供一個默認實現,必須用default修飾符標記這樣的方法,一個類實現一個接口,如果這個接口中一個方法有默認實現,那麼這個類可以不再實現這個方法(極度不推薦這樣做,除非確實不需要實現這個方法)。

解決默認方法衝突:

如果一個接口中將一個方法定義為默認方法,然後又在父類中或另一個接口中定義了同樣的方法,java中這樣規定:

  1. 父類優先。如果父類提供了一個具體方法,同名且具有相同參數類型的默認方法會被忽略

  2. 接口衝突。如果兩個接口提供了一個同名且同參數的默認方法,那麼實現這兩個接口的類必須覆蓋這個方法。


分享到:


相關文章: