本節介紹抽象類和抽象方法.
- 什麼是抽象類?
- 抽象類如何定義?abstract關鍵字
- 抽象方法
什麼是抽象類?
一個類如果沒有足夠的資訊來描述,那麼它就應該被設計成抽象類.
是以可以說抽象類就是一個有這麼個功能,但不清楚要如何實作的這麼一個類.
比如有一個動物類,動物都有吃的動作,但每一種動物吃的方式可能不同.這種情況下動物類就應該被設計成抽象類
抽象類如何定義?abstract關鍵字
如下,設定一個抽象類就是public abstract class 類名就可以了
public abstract class Animal {
public void eat(){}
}
申明成了抽象類就意味着這個類的功能不夠明确,我們沒有足夠的資訊來描述它,是以抽象類它不能被執行個體化.
public static void main(String[] args) {
Animal animal = new Animal() ;//這樣會直接報錯提示abstract類不能被執行個體化
}
是以我們就需要一個子類來實作它.比如我們建立一個鳥類繼承動物類來實作這個吃的方法
public class Bird extends Animal{
@Override
public void eat() {//重寫動物類的eat()方法
System.out.println("鳥啄着吃");
}
}
這樣重寫動物類的eat()方法,這是動物類的吃這個功能就被具體化了.有足夠的資訊來描述他了。是以這個時候就能執行個體化,但是要執行個體化實作了eat的那個類,也就是Bird
public static void main(String[] args) {
Animal animal = new Bird() ;
animal.eat();//這樣就具體化了。
}
總結:
1,抽象類不能被執行個體化,它直接被繼承
抽象方法
上面的例子說到了動物的吃是一種抽象的行為,因為每一種動物的吃法都可能不同.但是代碼上并沒有展現出吃是一種抽象行為
比如
public class Bird extends Animal{
@Override
public void eat() {
super.eat();//能調用animal類的eat(),說明了這個動物類的吃是具體的。
}
}
是以抽象類有一個特殊組成,就是抽象方法.上面的eat()方法就應該是抽象方法.
抽象方法就是一個不知道具體行為,但又确實存在的一個行為,如過一個方法是抽象方法,那它在代碼中展現出來就是我們直接調用Animal類的eat()應該要報錯,因為我們不知道Animal的eat()行為.
抽象方法如何寫?
public abstract class Animal {
public abstract void eat();//abstract修飾,沒有大括号,直接分号
}
就這麼寫,用abstract修飾,去掉{}直接寫分号.此時上面的super.eat()就會報錯.會提示無法直接調用抽象方法,因為它是抽象的,我們不知道它的具體行為(代碼中的表現就是沒有方法體)
再看以下代碼
public class Bird extends Animal{}//報錯,提示必須重寫父類的抽象方法
子類繼承了父類,但沒有去重寫它的抽象方法,那就說明這個子類同樣也是沒有辦法具體描述的,那麼它也必須是抽象類
public abstract class Bird extends Animal{}//編譯通過
總結:
1,子類繼承父類就必須重寫父類的抽象方法,否則該類也必須聲明為子類.
因為不這麼做,你無法具體描述這個對象.
抽象類和抽象方法總結
1, 抽象類不能被執行個體化。隻有抽象類的非抽象子類可以建立對象。
2. 抽象類中不一定有抽象方法,但是有抽象方法的類一定是抽象類。
3.抽象類中的抽象方法沒有方法體,就隻是一個申明,需要子類繼承并重寫來實作它
4. 構造方法,static方法不能聲明為抽象方法。
5, 子類繼承抽象類,那麼必須重寫抽象類的抽象方法,否則該子類也必須申明為抽象類