【Java語言基礎】抽象類與抽象方法

【Java語言基礎】抽象類與抽象方法

我們創建一個面積類,並且在這個類中創建面積對象,但是當你提到面積類,你並不知道我說的是求什麼圖形的面積,只有看到了具體的圖形,你才知道這是什麼圖形,所以說面積本身並不是一個具體的事物,而是一個抽象的事物。只有真正的長方形,圓形才能具體的求出面積,同理我們也可以求出不同的面積,他們的面積公式應該是不一樣的,所以我們不應該在面積類中給出具體的公式,而是給出一個聲明即可。

抽象方法

Java中,這種沒有方法體的方法稱爲抽象方法
抽象方法聲明格式:
[修飾符] abstract 返回值類型 方法名([形參]);
抽象方法的特點

  • 抽象方法的返回值類型前有關鍵字abstract
  • 抽象方法沒有方法體
  • 抽象方法的定義是一行單獨語句,以分號結束
  • 在抽象方法聲明中使用static修飾符是錯誤的。

例如:
public abstract double area();

抽象類

類中如果定義了抽象方法,那麼這個類必須定義爲抽象類。
抽象類聲明格式:

[public] abstract class 類名{
	//類體(屬性,非抽象方法,抽象方法,構造方法)
	//類體(初始化塊,內部類,枚舉類)
}

重要!

  • 抽象類不能創建自己的對象,使用new創建抽象類對象將產生錯誤。
  • 子類繼承抽象類時,應該覆蓋抽象類中的所有抽象方法,否則子類也必須定義爲抽象類。
  • 含有抽象方法的類(包括直接定義了一個抽象方法;繼承了一個抽象父類,但沒有完全實現父類包含的抽象方法)只能被定義成抽象類。但抽象類中卻並不一定要包含抽象方法。
  • 抽象方法和空方法體的方法不是同一個概念!
//是一個抽象方法,它根本沒有方法體,即方法定義後面沒有一對花括號。
//抽象方法:
public abstract double test();
//一個普通方法,定義了方法體,只是方法體爲空,因此這個方法不可以使用abstract來修飾。
//空方法體:
public void test(){}

使用注意

注意!

  • finalabstract永遠不能同時使用。
  • abstract不能用於修飾屬性,不能用於修飾局部變量,既沒有抽象變量,也沒有抽象屬性等說法abstract也不能用於修飾構造方法,沒有抽象構造方法。抽象類裏定義的構造方法只能是普通構造方法
  • staticabstract不能同時修飾某個方法,即沒有所謂的類抽象方法
  • abstract關鍵字修飾的方法必須被其子類重寫纔有意義,否則這個方法將永遠不會有方法體,因此abstract方法不能定有爲private訪問權限。

抽象類的作用

  • 代碼重用:子類可以重寫抽象父類中的屬性和非抽象方法
  • 規劃:抽象類中通過定義抽象方法規劃了其所有子類必須要實現的功能,或者說指定了其子類對象與外界的交互界面,因爲抽象方法的方法頭部已經規定了該方法將來被子類對象調用的格式

模板模式:

  • 模板模式:抽象類作爲多個子類的通用模板,子類在抽象類的基礎上擴展,改造,但子類總體上會保留抽象類的行爲方式。
  • 抽象類不能實例化,但是抽象類可作爲變量的類型方法形參類型,可將抽象類子類的對象賦給該變量或做方法的實參。

實例應用:

package javanotes;
/**
 * 定義抽象類Shape 包含抽象方法calArea()
 *  然後定義兩個子類 Rect 和 Circle類 在子類裏覆蓋父類的calArea(),
 *  然後定義測試類TestShape進行測試
 *  @author 董夢宇
 */
public class TestShape {
    public static void main(String[] args) {
        AbstractShape rect1 = new Rect(5,5);
        double a = rect1.calArea();
        System.out.println("長方形面積爲:" + a);
        AbstractShape circle1 = new Circle(1);
        double b = circle1.calArea();
        System.out.println("圓形面積爲:" + b);
    }
}
abstract class AbstractShape{
    public abstract double calArea();
}
class Rect extends AbstractShape{
    private double length;
    private double width;
    public Rect(double length,double width) {
        this.length = length;
        this.width = width;
    }
    @Override
    public double calArea() {
        return this.length * this.width;
    }
}
class Circle extends AbstractShape{
    private double radius;
    final double n = 3.14;
    public Circle(double radius) {
        this.radius = radius;
    }
    @Override
    public double calArea() {
        return this.radius * this.radius * this.n;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章