我們都知道在面向對象的領域一切都是對象,同時所有的對象都是通過類來描述的,但是並不是所有的類都是來描述對象的。如果一個類沒有足夠的信息來描述一個具體的對象,而需要其他具體的類來支撐它,那麼這樣的類我們稱它為抽象類。比如new Animal(),我們都知道這個是產生一個動物Animal對象,但是這個Animal具體長成什麼樣子我們並不知道,它沒有一個具體動物的概念,所以他就是一個抽象類,需要一個具體的動物,如狗、貓來對它進行特定的描述,我們才知道它長成啥樣。
在面向對象領域由於抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能實例化的。
同時,抽象類體現了數據抽象的思想,是實現多態的一種機制。它定義了一組抽象的方法,至於這組抽象方法的具體表現形式有派生類來實現。同時抽象類提供了繼承的概念,它的出發點就是為了繼承,否則它沒有存在的任何意義。所以說定義的抽象類一定是用來繼承的,同時在一個以抽象類為節點的繼承關系等級鏈中,葉子節點一定是具體的實現類。(不知這樣理解是否有錯!!!高手指點….)
在使用抽象類時需要注意幾點:
1、抽象類不能被實例化,實例化的工作應該交由它的子類來完成,它只需要有一個引用即可。
2、抽象方法必須由子類來進行重寫。
3、只要包含一個抽象方法的抽象類,該方法必須要定義成抽象類,不管是否還包含有其他方法。
4、抽象類中可以包含具體的方法,當然也可以不包含抽象方法。
5、子類中的抽象方法不能與父類的抽象方法同名。
6、abstract不能與final並列修飾同一個類。
7、abstract 不能與private、static、final或native並列修飾同一個方法。、
實例:
定義一個抽象動物類Animal,提供抽象方法叫cry(),貓、狗都是動物類的子類,由於cry()為抽象方法,所以Cat、Dog必須要實現cry()方法。如下:
public abstract class Animal {
public abstract void cry();
}
public class Cat extends Animal{
public void cry(){
System.out.println("貓叫:喵喵...");
}
}
public class Dog extends Animal{
public void cry(){
System.out.println("狗叫:汪汪...");
}
}
public class Test {
public static void main(String[] args){
Animal a1=new Cat();
Animal a2=new Dog();
a1.Cry();
a2.Cry();
}
}
創建抽象類和抽象方法非常有用,因為他們可以使類的抽象性明確起來,並告訴用戶和編譯器打算怎樣使用他們.抽象類還是有用的重構器,因為它們使我們可以很容易地將公共方法沿著繼承層次結構向上移動。