jdk8下的接口和抽象類
接口
在java8中,接口可以定義變量和方法,其中變量必須為 public && static && final;
方法必須為public && (abstract || default || static)。
jdk8隻能通過接口類調用接口中的靜態方法,但是對於default方法來說,如果兩個接口中定義了相同方法簽名的default方法,且實現類同時繼承了兩個接口。則在編譯時會報錯。此時可以讓實現類重寫該方法。
抽象類
包含一個或多個抽象方法的類,必須被申明為抽象類。
但不是抽象類中所有的方法都是抽象方法,除了抽象方法外,抽象類還可以擁有具體的方法以及具體數據
一個類如果繼承一個抽象類,必須實現該抽象類里聲明的抽象方法
區別 | 抽象類 | 接口 |
---|---|---|
繼承/實現 | 只允許繼承單個抽象類,可以不實現所有的抽象方法,但是子類也必須申明為抽象類 | 可以繼承多個接口,但繼承的類必須實現所有接口的所有抽象方法 |
變量 | 可以有具體的變量 | 只能有靜態常量 public static final |
方法 | 抽象類的方法可以是public,protected,default,但是不允許private | 接口的方法必須是public,可以有抽象abstract,默認defualt,靜態static |
構造函數 | 擁有默認構造函數 | 無構造函數 |
子類實現 | Extends | Implment |
設計理念和使用場景 | 是對同一個類型下共有的特性抽象。抽象類是一種 自下而上 的設計,先有了子類,然後提取子類公有的特性與行為,構成抽象類。 抽象類與子類是 is-a 關係,父類和派生的子類在概念上是相同的,存在的是父子關係,是一種重耦合。 | 它定義了一種規範,更多的是輻射類型的設計。接口是一種 自上而下 的設計,先規定行為方法,然後由類去實現這些行為,就可以成為接口的實現類。接口與實現類是 like-a 關係,接口與實現類的關係只是定義了行為,本質上並無實質關係,只是契約層面的關係。 |