簡體   English   中英

為什么可以在抽象類中實現接口,而不能在其他接口中實現?

[英]why interfaces can be implemented in abstract classes but not in other interfaces?

我知道一個接口不能在另一個接口中實現,因為實現意味着編寫方法的主體。 這不能在接口中完成,因為接口中的任何方法都沒有主體。 {最多Java 7}

但是我很困惑,如果這是接口不能彼此實現的原因,那么為什么接口可以在抽象類中實現。 由於抽象類不能必然定義接口的所有方法。 因此,以某種方式,抽象類無法實現接口的所有方法。

接口不能使用implements因為它們的目的是定義接口而不提供實現。 (盡管它們可以extend其他接口。)類的目的是提供實現,即使只是部分實現。

但是像幾乎所有規則一樣,邊緣模糊不清:

  • 抽象類實際上不需要實現任何東西。
  • 現在,Java接口具有默認方法 ,從某種意義上講,它們可以實現接口,而無需使用關鍵字implements

     interface A { void foo(); } interface B extends A { void bar(); default void foo() { System.out.println("foo"); } } public class Example implements B { public static void main(String[] args) throws Exception { new Example().foo(); } public void bar() { } } 
  • 通常,人們不會費心定義與類不同的接口,而是同時使用類來定義其接口提供其實現。 (一些純粹主義者對此有疑問,但這是非常普遍的做法。)

但是,從根本上講:接口用於定義接口,而類用於提供實現。

第一: “這不能在接口中完成,因為接口中的任何方法都沒有主體。” :必須注意,這有點過時了。 接口可以具有方法實現/主體(默認和/或靜態方法)。 從Java 8開始這是可能的。

為什么可以在抽象類中實現接口,而不能在其他接口中實現?

您的問題可能嚴格地是關於implements關鍵字聲明的,因為那是它所起作用的唯一方面。 從這個意義上講,這是設計問題。 抽象類是類,接口是接口。 這兩種類型的組件之間存在差異,在這種情況下,最值得注意的是具體類不能從多個抽象類繼承。 關於抽象類和接口(例如this )之間的區別,SO上有很好的答案。

但是,從概念上講,接口可以extends另一個接口,然后為每個繼承的抽象方法提供default方法的實現。 有人可能會說這是超級接口的一種實現。 但是當涉及到語言的細節時,只有一個類(無論是否抽象)都可以聲明implement接口。

最后,盡管具體方法是在接口中還是在抽象類中,但在使用它們之前,必須先創建具體類的對象(此處不包括功能接口),因此區別不在於此。沒關系。

接口可以擴展其他接口。 至於抽象類:它們要求接口方法在實現后就立即實現。 但是,實現不必在抽象類中,而僅在擴展抽象類且本身不是抽象的類中。

你一定要知道 接口實現類 ,抽象類是一個類。 從Java Docs

接口只能由類實現或由其他接口擴展。

那么為什么接口不能實現另一個接口?

因為在您實現類時,您是在定義類的行為。 因此,將接口實現為另一個接口將破壞接口的用途。 實現定義您需要方法的實現,並且接口不只實現類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM