Java中的類是單繼承的,但接口可以多繼承,類也可以實現多個接口


初次看到Spring的ApplicationContext,引發如下疑問:

Question:為什么java中的類是單繼承的,接口卻可以多繼承?

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
      ...
}

(1) java中的類是單繼承的
如果一個類繼承了兩個類,但是這兩個類中有相同的方法,那么子類調用,無法確定應該調用哪個方法。

(2) 接口可以多繼承
因為接口只有抽象方法,具體方法只能由實現接口的類實現,在調用的時候始終只會調用實現類(也就是子類覆蓋的方法)的方法(不存在歧義),因此即使繼承的兩個接口中的方法名是一樣的,最終調用的時候也都是調用實現類中的那個方法,不會產生歧義;

而又因為接口只有靜態的常量,但是由於靜態變量是在編譯期決定調用關系的,即使存在一定的沖突也會在編譯時提示出錯;而引用靜態變量一般直接使用類名或接口名,從而避免產生歧義,因此從接口的變量是來看也是可以通過的。

interface 接口名稱 {
    public static final 全局常量;
    public abstract 抽象方法;
}

一個子類可以同時實現多個接口,那么實際上就擺脫了Java中的類單繼承局限。

Question:interface可以implement多個interface,也可以extends多個interface,有什么區別?

其實這個問題提的本身就有不對。因為:實現多個接口指的是:子類實現多個接口,而不是說接口實現多個接口!

class 子類 implement 接口A, 接口B,..{
}

In a wordJava中的類是單繼承的,但接口可以多繼承,類也可以實現多個接口

note

  1. 接口extends接口可以不實現父接口中的方法,可以聲明自己的新方法;
  2. 類實現接口時,一定要實現接口中聲明的方法,如果接口中沒有定義抽象方法則不需要;但是要注意,類實現了一個接口A,如果B是A的父接口,且B中有抽象方法,則該類必須實現A和B中的所有抽象方法;
  3. 抽象類實現接口,可以不實現接口中的抽象方法;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM