初次看到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 word
:Java中的類是單繼承的,但接口可以多繼承,類也可以實現多個接口。
note
:
- 接口extends接口可以不實現父接口中的方法,可以聲明自己的新方法;
- 類實現接口時,一定要實現接口中聲明的方法,如果接口中沒有定義抽象方法則不需要;但是要注意,類實現了一個接口A,如果B是A的父接口,且B中有抽象方法,則該類必須實現A和B中的所有抽象方法;
- 抽象類實現接口,可以不實現接口中的抽象方法;