1.抽象類
- 抽象類,用來表示一個抽象概念.
- 是一種只能定義類型,而不能產生對象的類,所以定義了抽象類則必須有子類的出現.
- 抽象類的好處在於能夠明確地定義子類需要覆寫的方法
- 抽象類需要使用abstract聲明.
- 抽象類里可以實現抽象方法,該方法特征在於:只有聲明,並沒有方法體(所以子類必須全部覆寫,並且子類不能為抽象類)
比如圖形(Shape)類, 就是一個抽象的概念,因為我們無法計算這個“圖形”的面積,所以它的成員函數area()是空的。
而繼承它的子類(矩形,橢圓形,三角形等)就可以去覆寫area()成員函數. 里面通過數學公式,計算出面積.
參考圖形(Shape)類,代碼如下:
abstract class Shape //抽象的圖形類 { abstract public double area(); //abstract修飾的方法為抽象方法,無需實現方法體.但是必須被子類覆寫 } class Ellipse extends Shape //橢圓類 { private double wr; //橢圓的半徑寬度 private double hr; //橢圓的半徑高度 public Ellipse(double wr,double hr) { this.wr = wr; this.hr = hr; } public double area(){ return 3.14159*wr*hr; } } public class Test{ public static void main(String args[]) { //Shape s = new Shape(); //如果定義抽象類,則將會報錯 Ellipse e = new Ellipse(2.5,1); System.out.println("Ellipse area = "+e.area()); } }
需要注意的是:
- 抽象類可以存在構造方法,用來初始化抽象類的屬性,
- 抽象類不能使用final定義,
2.抽象內部類定義
在java中,如果我們抽象類的子類只有一個的話,則可以將它封裝為抽象內部類里,從而為用戶隱藏了這個無需知道的類.在類庫中很常見.
示例如下:
abstract class A //抽象類 { abstract public void printData();//abstract修飾的方法為抽象方法,無需實現方法體.但是必須被子類覆寫
static private class B extends A //需要在抽象類里隱藏的內部類 { private int Data=12; public void printData() { System.out.println("B Data:"+this.Data); //打印內部類的Data值 } } static public A getInstance() //獲取實例 { return new B(); //通過靜態方法來獲取要隱藏的靜態抽象內部類 (靜態方法里只能使用靜態變量) } } public class Test{ public static void main(String args[]) { A a = A.getInstance(); a.printData(); //等價於: A.getInstance().printData(); } }
打印如下:
抽象類缺點:
- 由於Java的單繼承,每個類只能從一個抽象類繼承.沒有接口靈活.
下章學習: 10.JAVA-接口、工廠模式、代理模式、詳解