接口存在的原因:
JAVA是單繼承的,不支持多繼承,但是有了接口,JAVA可以實現多個接口;
一個類要是實現某一個接口就必須實現接口內聲明的所有方法(強迫執行,即便是空方法,也要實現);
接口特點:
1.接口內所有方法只有聲明,沒有方法體(隱式聲明),例如:public abstract void func();
2.接口內的所有變量都默認是public static final ,必須被顯示初始化;
3.接口沒有構造方法,不能被實例化;
4.實現接口的類要實現所有的抽象方法,否則該類就必須聲明為抽象類,加上 abstract關鍵字;
5.接口不可以實現接口(所有接口都是抽象方法嘛),但是接口支持多繼承喲!
那么有接口要抽象類做什么呢?
首先我們認識一下抽象類
1.抽象類內允許有一般變量和一般方法;
2.抽象類必須有abstract關鍵字;
3.抽象類里面可以沒有抽象方法,但是即便如此,也不能實例化;(有抽象方法的一定是抽象類)
4.抽象類雖然不能被實例化,但是有構造方法(派生類可以擴展)
好了那么說一說抽象類,怎么用呢,什么時候用抽象類???
當有多個類實現同一個接口的時候,那么每個類都把那一個接口的所有方法實現了(如上文:實現接口,必須實現接口的所有方法);
那么如果有幾個方法,在這幾個子類中的實現完全一樣,我們就可以用抽象類來把這些方法單獨拿出來作為公共方法;
由抽象類來實現接口內,這些子類的公共方法(就是實現方式完全一樣的),然后這些子類只要繼承這個抽象類就OK了。
那么接口和抽象類應用邏輯就出來了
第一步,先寫一個接口,聲明實現這個接口應該要做的所有方法;
第二步,這個接口的實現有公用的部分,用抽象類來實現,這樣抽象類里有所有方法的聲明,以及公共方法的實現,所以簡化了接口的實現
第三步,派生類只要繼承並實現抽象類就OK!
以上文字如果覺得,有點繞,那么請看代碼示例:
先聲明一個接口
public interface InterExample{// 聲明一個接口 public abstract void function1(); public abstract void function2(); public abstract void function3(); public abstract void pubFunct(); // 公用方法聲明 }
聲明抽象類,實現上面的接口
public abstract class AbsExample implements InterExample{ // 實現公用方法 public void pubFunction(){ System.out.println("這是派生類的公用方法"); }// }
一般類(繼承了抽象類的派生類)
public class ExampleA extends AbsExample{
public abstract void function1(){
System.out.println("A派生類個性化使用的方法1");
} public abstract void function2(){
System.out.println("A派生類個性化使用的方法2");
} public abstract void function3(){
System.out.println("A派生類個性化使用的方法3");
}
}
public class ExampleB extends AbsExample{ public abstract void function1(){ System.out.println("B派生類個性化使用的方法1"); } public abstract void function2(){ System.out.println("B派生類個性化使用的方法2"); } public abstract void function3(){ System.out.println("B派生類個性化使用的方法3"); } }
代碼里面看到:公共方法即:pubFunction(),在抽象類內實現了,ExampleA,ExampleB公用,沒有必要在ExampleA、ExampleB兩個類內分別各寫一遍相同的實現代碼了;
另外:如果增加子類ExampleC,pubFunction()的實現和ExampleA、ExampleB不同,那么只要在ExampleC內重寫一遍該方法就好,依然保持靈活。
重新整理的抽象類和接口,希望能為大家答疑解惑!