一、這裏咱們來參考一下博文。java
http://blog.csdn.net/fenglibing/article/details/2745123ide
接口和抽象類有什麼區別 spa
你選擇使用接口和抽象類的依據是什麼?.net
接口和抽象類的概念不同。接口是對動做的抽象,抽象類是對根源的抽象。設計
抽象類表示的是,這個對象是什麼。接口表示的是,這個對象能作什麼。code
好比,男人,女人,這兩個類(若是是類的話……),他們的抽象類是人。說明,他們都是人。orm
人能夠吃東西,狗也能夠吃東西,你能夠把「吃東西」定義成一個接口,而後讓這些類去實現它.對象
因此,在高級語言上,一個類只能繼承一個類(抽象類)(正如人不可能同時是生物和非生物),可是能夠實現多個接口(吃飯接口、走路接口)。blog
第一點. 接口是抽象類的變體,接口中全部的方法都是抽象的。而抽象類是聲明方法的存在而不去實現它的類。
第二點. 接口能夠多繼承,抽象類不行
第三點. 接口定義方法,不能實現,而抽象類能夠實現部分方法。
第四點. 接口中基本數據類型爲static 而抽類象不是的。//在實際的操做中不須要顯示申明爲final,若是成員方法被默認修飾,默認爲public static修飾,若是成員變量被默認修飾,其修飾爲public static final類型。繼承
當你關注一個事物的本質的時候,用抽象類;當你關注一個操做的時候,用接口。
抽象類的功能要遠超過接口,可是,定義抽象類的代價高。由於高級語言來講(從實際設計上來講也是)每一個類只能繼承一個類。在這個類中,你必須繼承或編寫出其全部子類的
全部共性。雖然接口在功能上會弱化許多,可是它只是針對一個動做的描述。並且你能夠在一個類中同時實現多個接口。在設計階段會下降難度的。
二、我我的對接口和抽象類的理解 代碼上來。
這裏我首先定義兩個接口,Interface1,interface2,interface3,interface4
package com.yuan.test; public interface Interface1 { public String abc="1123";//實際上你能夠定義string,或者說你沒必要要申明爲final static 由於它在接口當中,麼有方法,因此不能夠賦值或者修改。 //public final static String abc="1123"; public void abc(); }
package com.yuan.test; public interface Interface3 { public void abcde(); }
package com.yuan.test; public interface Interface2 extends Interface1,Interface3 { public void abcd(); }
package com.yuan.test; public interface Interface4 { public void abcdef(); }
/***抽象類以及抽象的方法**/
package com.yuan.test; public abstract class AbstractTest { public void ab1(){} //若是不說明爲抽象的方法,必需要加上方法體 public void ab2() {}////若是不說明爲抽象的方法,必需要加上方法體 public abstract void ab3();//若是聲明爲抽象的方法,不須要方法體 }
說明:
從Interface2能夠看出,接口能夠繼承多個接口。也就是接口能夠多繼承。可是抽象類繼承只能夠繼承一個。
我有另一個問題是,接口除了能夠繼承接口以外,能夠繼承抽象類嗎??答案是不能夠的。緣由爲註釋
package com.yuan.test; //The type AbstractTest cannot be a superinterface of Interface1; // a superinterface must be an interface public interface Interface1 extends AbstractTest{ public void abc(); }
/********總結一點,就是接口能夠被接口繼承,而後能夠被抽象類實現,另外接口不能夠實例化,但能夠經過子類的引用指向它******/
package com.yuan.test; public class TestInterface extends Counter implements Interface2,Interface4{ public static void main(String[] args){ Interface1 i1=new TestInterface();//經過子類的引用指向接口。 System.out.println("i1:"+i1.abc); } @Override public void abc() { // TODO Auto-generated method stu } @Override public void abcd() { // TODO Auto-generated method stub } @Override public void abcde() { // TODO Auto-generated method stub } @Override public void abcdef() { // TODO Auto-generated method stub } }