天天看點

JAVA初級(十四)抽象類介紹,抽象方法使用什麼是抽象類?抽象類如何定義?abstract關鍵字抽象方法

本節介紹抽象類和抽象方法.

  • 什麼是抽象類?
  • 抽象類如何定義?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, 子類繼承抽象類,那麼必須重寫抽象類的抽象方法,否則該子類也必須申明為抽象類