相對abstract class(抽象類)來講,interface則造出了“完全抽象的class”,絲毫不帶半點實現(xiàn)的內(nèi)容。且interface中的所有methods都是虛的空的,當(dāng)然,編譯器也強迫你這樣做??聪旅媸吕?div> interface A{
void x();//這里不需寫訪問權(quán)限,x()就自動成為了public void x()
String Hello();
}
interface中的方法無需聲明,都會自動設(shè)為了public。
當(dāng)然,interface中的數(shù)據(jù)成員也變?yōu)榱藀ublic,static,final。
看例子:
class B implements A{
String str="Hello";//這里的str很自然的變成了public static final int str;
public void x(){
//……//
}
public String Hello(){
return str;
}
}
要注意,當(dāng)某個類(like class B)實現(xiàn)了一個接口時,一定要把它實現(xiàn)的methods(函數(shù))標(biāo)明為public,否則編譯器不會讓你好過。
以上只是interface的普通用法罷了,更讓人興奮的是:它可以讓你實現(xiàn)原本以為java中沒有的“多重繼承”。即,你可以是個A,也可以是個B和C。看下面:
class father{}
interface Human{}
interface Boy{}
class Me extends father implements Human,Boy{}
呵呵,你們看到了,如語義,爸爸正繼承(extends)一個,但我的身份卻可以是“人類(human)”或者“男孩(boy)”。同樣,在java中,只能繼承一個一般的Class(non-interface即非接口類),但你卻可以繼承多個interface,也可以說“interface讓你擁有多個身份”。這當(dāng)然更利于多態(tài)的應(yīng)用咯。
還有,interface也是可以繼承其它類的,但,只能是繼承另一個接口。如以下:
class A{}
abstract class B{}
interface C{}
//!interface D extends A{}
//!interface D extends B{}
interface D extends C{}//看到吧,接口只能繼承接口,繼承其它的話,編譯器回生氣喲
然后呢,咱們再看一個比上面復(fù)雜一點的例子,說明了你不能胡亂的把兩個接口同時實現(xiàn):
interface A{void a();}
interface B{void b();}
class Xa{
public void a(){}
}
class Xb{
public int b(){return 53;}
}
class Hero extends Xa implements A,B{
public void b(){}
//大家注意,為什么這兒實現(xiàn)了 A和B 兩個interface卻只實現(xiàn)了b()一個接口呢?后面分解
}
//!class ErrTest extends Xb implements B{}//這為什么報告錯誤呢?后面分解
public class Test {
static void mA(A a){//這兒之所以可以用a來調(diào)用是因為,下面會進行向上轉(zhuǎn)型,
//A的derived class reference傳到這里,當(dāng)然可以使用,下同。
a.a();
}
static void mB(B b){
b.b();
}
public static void main(String[] args) {
Hero h=new Hero();
mA(h);//向上轉(zhuǎn)型,因為上面接參的是Hero的base class
mB(h);
}
}///:~
好了,例子看完了,下面來解釋上面的幾個現(xiàn)象:
NO1.class Hero為什么實現(xiàn)了 A和B 兩個interface卻只實現(xiàn)了b()一個接口呢?因為它還同時繼承了一個Xa類,而Xa中恰好又一個一模一樣的void a(),所以,在繼承的同時,“爸爸替兒子”自動的實現(xiàn)了a(),不用“兒子”親自動手。
但是注意,必須要是完全相同才行!(即需要同參數(shù)列表、同返回值),否則就會?看下面:
NO2. ErrTest不能再寫下去是因為,它所繼承的B類的void a()與它所實現(xiàn)的Xb接口中的int a()產(chǎn)生沖突。兩者名稱相同,但是返回值不一樣,導(dǎo)致編譯器不知道該使用哪一個或者應(yīng)該重寫等,所以會報出錯誤。這就是沖突。
所以,須提醒的是:盡量不要結(jié)合含同名參數(shù)的interface等,或者就干脆不要寫同名的函數(shù)。
Interface還有一重要功能,平常不為人所用的:產(chǎn)生常量群?。∮捎趇nterface中的數(shù)據(jù)成員會自動成為public static final,所以……如下:
public interface Months{
int
JANURAUY=1,//再次說明,常量都要全部用大寫,語義間用下劃線分開如: VAL_XX
FEBRUARY=2,
MARCH=3;
}
然后要用的話,就直接
Months. JANURAUY*10類似的直接用就行了!完全OK?。〕壓糜茫。?/div>
提醒:interface的常量群眾的數(shù)據(jù)成員,因為是static靜態(tài)的,所以當(dāng)你首次使用這個常量群時,就會自動初始化里面的數(shù)據(jù),不管你使用多少次它的數(shù)值都不會再變了。如下:
public interface Vals{
int VAL_A=(int)(Math.random()*10);
}
我們看到,VAL_A是由隨機數(shù)得值的,但當(dāng)你第一次使用它時,VAL_A被賦予了一個隨機數(shù)3.14,但以后不管你用多少次,都只是同一個數(shù)3.14。
然后呢,interface可以互相嵌套,既可以嵌在class中,也可以嵌在另一個interface中。
Interface的嵌套可以發(fā)展出很多有趣的性質(zhì)來,但是內(nèi)容過多,一時間無法全部寫下,so就此寫一小點吧,需要用時再做深究。
“當(dāng)某一個interface嵌套到了另一個interface中時,則它一定會變成public,無法標(biāo)記為private”。
“當(dāng)你實現(xiàn)某個interface時,根本無須實現(xiàn)嵌套在它里面的Other interfaces”
此外,“private interface是無法在它所定義的class之外被發(fā)現(xiàn)的”。
好了,Interface(接口)就想到這里了。