Java里的接口的interface 简单介绍.
這是寫給我自己和我這種初學者看的.
Java作為1個強面向對象語言,? 基本上所有東西(成員和方法)都是寫在class(類)里面的.
但是也存在一種與class平行的東西, 它就是interface , 中文譯成接口.? 本屌能力有限在這里這能寫寫Interface的一些語法規(guī)則與存在意義.
一, 什么是接口
Java里的接口, 就是抽象方法和常量值的集合.?????
這里的定義相當表面, 就如java里的類是成員和方法的集合一樣.????
作為1個初學者, 可以簡單理解為接口就是一種特殊的抽象類.? 區(qū)別下面會詳細提到.
二, Java里接口的定義和語法
interface 的定義跟java有點類似.?? 大概如下:[public]? interace?interface_name [extends <Superinterface_list>]{
??????? //public static final members
????????? .....................
?????? //public abstract methods
?????? .......
}
下面是1個簡單的例子:
interface It_1{ int i = 10; //public static final//int j; //error all the members in a interface must be a const member //& need assignment//public abstract It_1(); //error, must without a constructorvoid print(); //public abstract }上面就簡單定義了一個接口It_1. 接下來講下接口定義的一些關鍵點:
2.1 關于接口前面的修飾符(這里只討論外部接口)
外部interface前面的修飾符有兩種:
2.1.1 public修飾接口
接口可以用public修飾, 但是這個接口必須定義在同名字的java文件內(nèi). ? 這種情況下此接口就是所謂的公共接口, 可以被所有類訪問. 這也是interface最常見的用法.2.1.2 沒有任何修飾詞修飾接口
?如果1個接口不是在同名字的java文件內(nèi)定義的. ? 那么這個接口前面不能帶有任何權限修飾符, 就如上面的例子.? 關鍵字前面沒有權限修飾符.
如果架上public 則通不過編譯.
這種情況下, 這個接口只能被同1個包內(nèi)的類訪問. 其他類不能訪問.
2.1.3 不能用protected ,private 來修飾外部接口
跟外部類一樣, 外部接口不能private 和 protected 來修飾.2.1 接口里所有成員都是公共靜態(tài)常變量成員.
也就是說接口里所有成員都是有個修飾組合: ? public ?static final.代表了這個成員首先是公共的(所有類都可以訪問), ? 靜態(tài)的(只屬于接口本身), ?而且是個常變量(只能而且必須賦值一次).
這個組合可以被省略.
例如上面例子中的
int i = 10; 就相當于 ?public static final int i =10;
但是你寫成 ?
static final int i =10; ?
final int i = 10;
都是可以通過編譯的, ?但是i這個成員實際上還是 ?public static final的, 性質(zhì)沒變. ??
但是不能用protected 或 private 來修飾成員, 否則編譯失敗.
2.2 接口里所有方法都是公共抽象方法
也就是說接口里的方法都有個修飾詞組合: public abstract跟接口方法一樣, 這兩個修飾詞也可以省略不寫.
既然是抽象方法, 則不能包含方法體.
而且接口里不允許存在非抽象的方法, 這個也是接口和抽象類的明顯區(qū)別之一.
2.3 接口里不能定義構造方法
即使這個構造方法是抽象的...三, 接口的實現(xiàn)和繼承
由于接口不是類, 所以接口沒有實例化這個概念. ?而且上面提到過接口類似1個抽象類.?而1個接口是可以繼承另1個接口的(extends)
但是java里1個類也不能繼承1個接口, 而有1個類似繼承的概念, ?就叫做實現(xiàn)( implements)
3.1 類可以實現(xiàn)接口
看下面的例子:class It_class1 implements It_1{ //implement an interfacevoid f(){//i = 10; error cannot do assignment for a const memberint j = this.i;}//void print(){ the signal of authority cannot smaller than super class's(interface)public void print(){ // overwrite an the abstract method.} }
這個類就實現(xiàn)了上面的接口It_1. ?接下來有幾點要注意的.
3.1.1 1個類要實現(xiàn)1個接口, 關鍵字是implements 而不是extends
extends是繼承的關鍵字, ?而1個類是不能繼承1個接口的.3.1.2 類里面不能為接口的成員賦值
類繼承1個接口的話, 可以使用接口的成員, 但是不能為它們賦值, 因為接口的成員都是常量.3.1.3 如果1個非抽象類繼承1個接口, 則必須重寫接口里的所有方法.
原因也很簡單, 因為接口的方法都是抽象的, 跟1個非抽象類繼承1個抽象類一樣, 都必須重寫繼承的所有方法. ? ? 非抽象類不允許有抽象方法.3.2 接口的實現(xiàn)(implement)可以多態(tài)
也就是說雖然接口不能被實例化, 但是1個接口的引用變量可以指向實現(xiàn)它的類的1個對象.跟繼承的多態(tài)類似
下面例子:
public class Interface_1{public static void f(){It_1 a = new It_class1(); // Polya.print();} }
看f()函數(shù), ?它定義了 1個接口的引用a, ?但是指向了1個類的對象(前提是這個類實現(xiàn)該接口) 并調(diào)用了類重寫后的方法.
3.3 接口可以繼承接口
類可以繼承類, ?而接口也可以繼承另1個接口.下面例子:
package Interface_kng.Extend;interface Itf_1{int i = 1;void f(); }interface Itf_3 extends Itf_1{int j = 3; }class Itf_class1 implements Itf_3{public void f(){ //overwriteSystem.out.printf("i is %d, j is %d\n", this.i, this.j);} }public class Interface_3{public static void f(){Itf_class1 a = new Itf_class1();a.f();} }
上面定義了2個接口, 其中Itf_3 繼承了 Itf_1. 所有Itf_3 具有Itf_1的所有成員和方法.
后面 類 Itf_class1 實現(xiàn)了接口Itf_3, 并重寫了Itf_3繼承自 Itf_1的方法f(), 輸出了接口的兩個成員值.
3.4 1個接口可以同時繼承多個接口
跟類的單繼承不同, 接口的繼承可以是多繼承.看回本文第二節(jié)的接口語法定義, ?后面的extends 跟的是1個list. 也就暗示了這可能是1個多繼承.
下面例子:
interface Itf_1{int i = 1;void f(); }interface Itf_2{int k = 2;void g(); }interface Itf_3 extends Itf_1, Itf_2{int j = 3; }class Itf_class2 implements Itf_3{public void f(){ //overwriteSystem.out.printf("i is %d, k is %d, j is %d\n", this.i, this.k, this.j);}public void g(){} }public class Interface_3{public static void f(){Itf_class2 a = new Itf_class2();a.f();} }
上面的接口Itf_3 同時繼承了接口Itf_1 和 Itf_2. 所以Itf_3 同時具有了兩者的成員和方法
接著非抽象了類 Itf_class2 實現(xiàn)了Itf_3, 并重寫了所有接口方法.
接口的多繼承有時也會產(chǎn)生沖突. 下面有兩種情況要注意的:
3.2.1 ?假如1個接口A 繼承另外兩個接口B和C, ?但是接口B,C 有相同名字的成員i
這種情況并不影響多繼承, ? 但是當1個類實現(xiàn)了接口A時, 使用成員i時就不能用this.i了.因為編譯器會告訴你成員混擾. ? 需要告訴編譯器你想調(diào)用那個成員, 畢竟這個成員是靜態(tài)的, 前面可以加接口名字前綴.
例子: interface Itf_1{int i = 1;void f(); }interface Itf_2{String i = "abc";int k = 2;void g(); }interface Itf_3 extends Itf_1, Itf_2{int j = 3; }class Itf_class2 implements Itf_3{public void f(){ //overwriteSystem.out.printf("i1 is %d, i2 is %s, k is %d, j is %d\n", Itf_1.i, Itf_2.i, this.k, this.j);} public void g(){} }
例如上面的成員i, 如果在類中直接調(diào)用this.i, 編譯失敗..
3.2.1 ?假如1個接口A 繼承另外兩個接口B和C, ?但是接口B,C 有相同名字的方法f().
這里還要分兩種情況假如這兩個方法具有相同的返回類型.
這樣的話則不影響繼承. ? 在實現(xiàn)接口A時直接重寫一次f() 就ok了.
編譯器會將兩個同名方法視為1個方法:
package Interface_kng.Extend;interface Itf_1{int i = 1;void f(); }interface Itf_2{String i = "abc";int k = 2; //same name with Itf_1void f(); //same name with Itf_1void g(); }interface Itf_3 extends Itf_1, Itf_2{int j = 3; }class Itf_class2 implements Itf_3{public void f(){ //overwriteSystem.out.printf("i1 is %d, i2 is %s, k is %d, j is %d\n", Itf_1.i, Itf_2.i, this.k, this.j);} public void g(){} }
假如這兩個方法具有不同的返回類型.
這種情況下就悲劇了, ?一個非抽象類無法實現(xiàn)該接口
例如:
interface Itf_1{int i = 1;void f(); }interface Itf_2{String i = "abc";int k = 2; //same name with Itf_1int f(); //same name with Itf_1, but diff return typevoid g(); }
原因也很簡單, 因為1個非抽象類無法同時重寫這兩個方法.
1個類中不允許有兩個方法相同名字相同參數(shù)而返回值不同啊.
假如在工作中遇到這種情況怎么辦? ? ?除了重構.. 個人建議只能分別用兩個類來實現(xiàn)兩個接口...
所以在編程中, ?為接口的成員和方法命名時最好加上接口的標記.. ?避免將來可能發(fā)生的沖突...
3.5 1個類可以同時實現(xiàn)多個接口.
這個不難理解, 跟上面那點類似, ?不過也可能會出現(xiàn)上面提到的沖突..interface Itf_1{int i = 1;void f(); }interface Itf_2{String i = "abc";int k = 2; //same name with Itf_1void f(); //same name with Itf_1void g(); }class Itf_class1 implements Itf_1, Itf_2{public void f(){ //overwriteSystem.out.printf("i1 is %d, i2 is %s, k is %d", Itf_1.i, Itf_2.i, this.k);} public void g(){} }
3.6 1個類可以繼承另一個類的同時實現(xiàn)1個或多個接口.
這個也不難理解.
但是要把 extends 寫在前面, ?implements 寫在下面
語法:
class Class_nameextends Superclass_name?implements <Superinterface_list>{
}
個人建議, 小心使用, 因為如果超類也實現(xiàn)了1個或多個相同的接口時就可能有沖突了..
四, Java接口的功能和意義
說道這個, 很多java教材介紹接口時對會提到 電腦主板內(nèi)存插槽 和 內(nèi)存金手指的例子... ?但是本人覺得這個例子不是很能體現(xiàn)java接口的意義
本人覺得, java里的接口更像是1個功能包或插件.
而java的類實現(xiàn)1個接口就相當于裝備上了這個功能包或插件, 從而具有了這個功能包和插件的功能..
接下來還是引用權威吧..
1. 通過接口可以實驗不相關類的相同行為. 例如 java規(guī)定所有可以完成自我復制功能的類都必需實現(xiàn)java.lang.Colneable 接口. 而這個接口是空的. 沒有任何內(nèi)容, 只是起1個標記作用
2. 接口提供了不同對象進行協(xié)作的平臺 例如事件處理
3. ?接口可以實現(xiàn)多繼承, 一定程度上彌補了java類只能單繼承的缺點.
4. ?接口是我們了解1個類的功能的重要途徑 例如1個類的定義代碼很復雜, 而我們可以觀察它實現(xiàn)了哪些接口, 大概估出這個類的作用.
上面的描述并不很清楚.
接口的意義請參考另一篇博文
http://blog.csdn.net/nvd11/article/details/41129935
總結
以上是生活随笔為你收集整理的Java里的接口的interface 简单介绍.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 多态的简单介绍.
- 下一篇: jar包的生成和使用简单例子