感覺抽象類與接口都是爲了達到抽象的概念,Java抽象類可以提供某些方法的部分實現,如果向一個抽象類里加入一個新的具體方法時,那麼它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口裏加入一個新方法,所有實現這個接口的類就無法成功通過編譯了,因爲你必須讓每一個類都再實現這個方法才行,這顯然是Java接口的缺點。
在網上看又說抽象類是is-a的關係;接口是like-a的關係。
接口可以豐富類的功能,例如一個類實現java.lang.Comparable接口就可以與相同類型的其他對象進行比較,這個可以算作接口的優點吧。
Abstract Class:抽象類
1)抽象類中可以有構造方法,如果不寫,會有一個默認的空的構造方法,繼承抽象類的實現類實例化時會遞歸調用,首先調用抽象類的構造方法,然後再調用自己的構造方法。
/** * 類描述:抽象類 * @author 王要傑 * @version 1.0.8.1 * 創建時間 2014-3-4 */ public abstract class MyAbstractClass { int i = 0; public MyAbstractClass(int i) { i = 9; System.out.println("抽象類構造方法執行"); } } /** * 類描述:測試類 * @author 王要傑 * @version 1.0.8.1 * 創建時間 2014-3-4 */ public class AbstractTtest { public static void main(String[] args) { // TODO Auto-generated method stub Ttest a = new Ttest(); System.out.println(a.i); } } /** * 繼承抽象類的實現類 * */ class Ttest extends MyAbstractClass { public Ttest() { super(1);//由於抽象類我給的構造方法是含有參數的,實現類如果不指定調用有參數的構造方法,會默認執行super();這時會報錯哦 i = 10; System.out.println("實現類構造方法執行"); } }
輸出結果爲:
抽象類構造方法執行
實現類構造方法執行
10
2)抽象類可以有自己的實現方法,可以包含抽象的方法,抽象方法必須包含abstract關鍵字,不能被private修飾,可以是protected,public---這個思考?。
Interface 接口:
1)接口中的所有方法默認都是 public abstract 類型的;一般jdk源碼中定義的接口都省略了這兩個關鍵字;且必須給其初值,所以實現類中不能重新定義,也不能改變其值。
2)接口中可以定義一些屬性,但是這些屬性默認是public static final類型的(即使不寫這幾個關鍵字);-------但是下面代碼可以修改Student類中的name屬性,是因爲a指向的內存地址沒有變,所以ok。
/** * 類描述: * @author 王要傑 * @version 1.0.8.1 * 創建時間 2014-3-4 */ public interface myInterfaceS extends myInterfaceG { int i = 12;//默認public final static Student a = new Student("tom"); void close(String a);//默認public abstract } /** * Student類 * */ class Student { String name = ""; public Student(String name) { this.name = name; } public String toString() { return name; } }
3)接口繼承接口可以多繼承的。