定義
在瞭解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有宣告,而沒有具體的實現。抽象方法的宣告格式為:
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{
}
複製程式碼
我的理解:抽象方法的意義在於,將方法的設計和方法的實現分離了!