Abstract Class與Interface的區別

感覺抽象類與接口都是爲了達到抽象的概念,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)接口繼承接口可以多繼承的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章