1. 程式人生 > >Java學習筆記四-abstract和interface

Java學習筆記四-abstract和interface

Abstract class

抽象類。 一個類用abstract修飾,這就是一個抽象類。
抽象方法,一個方法用abstract修飾,這就是一個抽象方法。
抽象類裡面有抽象的方法(當然也可以有具體的方法也可以沒有抽象方法),但是不具體實現,留給子類去實現。抽象類最大的意義是作為父類存在,很好的體現面向物件的繼承和多型,抽象類自己是不能進行例項化的。
但是如果一個類中有抽象的方法,這個類就必須是抽象的(不然這個抽象類是不能參與建立物件啊)
abstract與final private native不能修飾同一個方法
看一個例子

public abstract class Animal {
    String type;
    Animal(String s){this
.type = s;} Animal(){}; //下面都是抽象方法,沒有花括號的方法體,留給子類去實現 public abstract void describe(); public abstract void sound(); public abstract void sleep(); public abstract void move(); }

下面是一個子類:

public class Cat extends Animal {
    private String name;
    protected String breed; 
    Cat(){};
    Cat(String name){
        this
.name = name; } //這裡要注意的是,繼承自一個抽象類,那麼抽象類中所有抽象方法都要實現 //實現的時候就不要加abstract關鍵字了 public void sound() { System.out.println("miao miao miao"); } public void move() { System.out.println("cat moves"); } public void sleep() { System.out.println("Cat does sleep"
); } public void describe() { System.out.println("This is a cat"); } }

要是繼承字一個抽象類但不實現父類全部的抽象方法,除非這個子類還是一個抽象類
比如:

public abstract class Bird extends Animal {
    protected String breed;
    public void move()//只實現了一個
    {
        System.out.println("Birds fly");
    }
}

不過注意子類中如果還有抽象方法,不能和父類重名,因為要繼續繼承下去,比如:

public class Robin extends Bird {
    private String type;
    public  void describe()
    {
        System.out.println("Robin is a bird ");
    }
    public void sound()
    {
        System.out.println("robin sounds good");
    }

    public  void sleep()
    {
        System.out.println("Ronbin needs sleep");
    }
    //這個move在直接父類bird裡不是抽象的,所以可以不實現直接繼承,但是其他的必須還要在實現
//  public  void move()
//  {
//      System.out.println("Robin flies very fast all the time");
//  }
}

抽象類有個方便的應用,當我想要彙總一堆cat robinbird的時候,一個一個弄很麻煩,一個animal的陣列就可以了
比如:

Animal [] ani = new Animal[3];
        ani[0] = new Cat();
        ani[1] = new Robin();
        for(int i = 0;i<2;i++)
            ani[i].move();

會輸出:
cat moves
Birds fly

當然這個例子可能體現不出來優勢,但是換做其他的就比較明顯了。

interface

介面
這是一個跟抽象類很像但是真的不一樣的東西。

相似點包括,不能例項化,裡面是抽象的方法,留給後面的類來實現,而且要把抽象的方法全都實現

但是也很不一樣,
比如在eclipse裡抽象類是new一個class而介面是new一個interface。
再比如 interface裡面一般不會有成員變數,有的話也全部是常量。所有的方法都是抽象的(即只有方法頭和引數列表),並且全得是public的,而抽象類作為一個類可以有成員,可以沒有抽象函式可以有不抽象的函式,可以有多種許可權的函式
再比如 因為java的繼承,一個子類只能繼承一個父類,而一個類可以implemnet多個介面

介面中也沒有構造方法
介面甚至可以通過native關鍵字實現其他語言來寫
介面可以多重繼承,一個類也可以繼承多個介面
介面是用來實現類間多重繼承的結構,是一種特殊的“抽象類”(當然並不是類)通過結構可以實現不相關類的相同的行為,而不需要考慮這些類之間的層次關係。也就是繼承中,Cat is Animal ,但是Anima裡move的屬性汽車也有,但是汽車不 is Animal, 但是如果move在接口裡,這兩個不相關的類都可以實現。

舉個例子:

//這是一個介面
public interface StudentManageInterface {
public void setFee(int f);
public int getFee();
}
//另一個介面
public interface TeacherManageInterface {
public void setPay(int p);
public int getPay();
}
//實現介面的類,逗號隔開多個介面
public class Graduate implements StudentManageInterface,TeacherManageInterface {
    public String name;
    public char sex;
    public int age;
    public int fee;
    public int pay;
    Graduate(){};
    Graduate(String name){
        this.name = name;
    }
    public void setFee(int fee){
        this.fee = fee;
    }
    public void setPay(int pay){
        this.pay = pay*12;
    }
    public int getFee()
    {
        return fee;
    }
    public int getPay(){
        return pay;
    }
}

總結一下:
1、abstract修飾的類是抽象類,裡面的抽象方法由abstract修飾,沒有方法體,但是可以有其他成員變數,建構函式,非抽象方法
2、抽象類不能產生例項,必須要由子類去實現具體的方法,並且如果子類不是抽象類,要實現父類全部的抽象方法
3、一個類中有抽象方法,這個類就得是抽象類
4、一個類可以實現多個介面,用implements關鍵字,用逗號隔開多個介面
5、實現介面的類不是抽象類的話也要實現介面中所有的方法
6、介面中成員只能是常量,方法都是public的抽象函式
7、abstract類和interface的區別:一個類只能繼承一個抽象類但可以實現多個介面;介面中的所有方法都是抽象的,所有的變數都是靜態不可修改的