JavaSE基礎:抽象類

胖先森發表於2018-01-25

定義

在瞭解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有宣告,而沒有具體的實現。抽象方法的宣告格式為:

abstract void fun();
複製程式碼

抽象方法必須用abstract關鍵字進行修飾。

如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。因為抽象類中含有無具體實現的方法,所以不能用抽象類建立物件。

問題說明: 在《JAVA程式設計思想》一書中,將抽象類定義為“包含抽象方法的類”,但是後面發現如果一個類不包含抽象方法,只是用abstract修飾的話也是抽象類。也就是說抽象類不一定必須含有抽象方法。個人覺得這個屬於鑽牛角尖的問題吧,因為如果一個抽象類不包含任何抽象方法,為何還要設計為抽象類?所以暫且記住這個概念吧,不必去深究為什麼。

[public] abstract class ClassName {
    abstract void fun();
}
複製程式碼

從這裡可以看出,抽象類就是為了繼承而存在的,如果你定義了一個抽象類,卻不去繼承它,那麼等於白白建立了這個抽象類,因為你不能用它來做任何事情。對於一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那麼就可以將這個方法宣告為abstract方法,此時這個類也就成為abstract類了。

為什麼需要抽象類?如何定義抽象類

  • 是一種模版模式抽象類為多有子類聽了一個通用的模版,子類可以在這個模版基礎上進行擴充套件
  • 通過抽象類,可以避免子類設計的隨意性。通過抽象類,我們就可以做到嚴格限制子類的設計,使子類之間更加通用。

抽象類的使用規則

  • 有抽象方法的類只能定義為抽象類
  • 抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法)。
  • 抽象類不能例項化以及不能new來例項化抽象方法
  • 抽象類可以包含屬性/方法/構造方法,但是構造方法不能用來new實現類,只能用來被子類呼叫
  • 不能用abstract修飾屬性、私有方法、構造器、靜態方法、final的方法。
  • 抽象類只能用來被繼承
  • 抽象方法必須被子類實現,否則子類也必然是抽象類

程式碼示例

package com.shxt.abstract_class;

public abstract class Animal {
    public abstract void run();

    public void breath(){
        System.out.println("呼吸");
        run();//呼叫
    }

    public Animal(){
        System.out.println("創造一個動物");
    }
}

class Cat extends  Animal{
    @Override
    public void run() {
        System.out.println("貓步輕跑");
    }
}
//抽象方法必須被子類實現,否則子類也必然是抽象類
abstract class Dog extends  Animal{

}
複製程式碼

我的理解:抽象方法的意義在於,將方法的設計和方法的實現分離了!

相關文章