我想,可能不止我一個人有這個疑問,所以,把它貼出來。
下面是madai和clkrst給我的回答。
在此謝謝兩位。
我的問題是:
java 的接口到底起什么作用?
1、從書中看到的是java程序的接口中只定義了常量及空方法,空的方法有什么用呢?還要在類中寫方法體,那還要接口干什么?
2、一個程序中寫了2個接口,並在同一個類中寫方法體,這與多繼承有什么關系。
3、包中那些已定義的接口,怎么知道那里面定義了什么方法。
說到底,接口有什么實際意義,哪本書都不講,一味的講是多繼承,不結合實際實在不好懂。
Madai的理解是:
java接口的用處主要體現在下面幾個方面:
(1)通過接口可以實現不相關類的相同行為,而不需要了解對象所對應的類。
(2)通過接口可以指明多個類需要實現的方法。
(3)通過接口可以了解對象的交互界面,而不需了解對象所對應的類。
Clkrst給出了更詳細的解釋:
類描述了一個實體,包括實體的狀態,也包括實體可能發出的動作。
接口定義了一個實體可能發出的動作。但是只是定義了這些動作的原型,沒有實現,也沒有任何狀態信息。
所以接口有點象一個規范、一個協議,是一個抽象的概念;而類則是實現了這個協議,滿足了這個規范的具體實體,是一個具體的概念。
從程序角度,簡單理解,接口就是函數聲明,類就是函數實現。需要注意的是同一個聲明可能有很多種實現。
所以就你的問題:
1、接口中定義類方法的原型,但是不能說是空方法,因為空方法的意思是有實現體,只不過實現體是空操作。實際上接口沒有定義任何實現體。具體的實現體都是在實現接口的類中,接口只是定義了這些方法的調用方式。
你當然也可以不用接口,直接在類里面寫方法,但是如果你的一組方法需要在很多類里實現,那么把它們抽象出來,做成一個接口規范,不是更好么?
2、一個類描述了一個實體,這個實體可能是一個復雜的對象,它的動作很多,如果把這些動作分類,用接口a定義其中的某一組動作,接口b定義其中的另外一組動作,這樣的結構,比較清楚。
這種方式具備了多繼承的優點,避免了多繼承的缺陷。實際上在歷史上,接口在很大程度上,是為了解決多繼承帶來的種種問題而設計出來的。
3、包中那些已定義的接口,怎么知道那里面定義了什么方法。
接口里定義了方法的輸入輸出,這些都是協議,具體的實現都在每個類中。對於很多只需要抽象接口的地方,不需要知道具體的類是什么,只要這個類實現了這個接口就可以了。