對面向抽象程式設計的理解
面向抽象程式設計是什麼,第一遍看的時候沒太注意,感覺的不是很重要吧,可當我去細看時,面向抽象的功能作用竟如此強大,我是應該再好好總結一下的。 |
面向抽象程式設計,顧名思義,是對抽象類(abstract)進行一系列操作的程式設計。也就是說 當設計某種重要的類時,不讓該類面向具體的類,而是面向抽象類,即 設計類中的重要資料 是 抽象類的物件 ,不是具體類宣告的物件。
簡單一點理解,就是定義了一個abstract類 和 一個abstract 方法,再定義一個或幾個abstract類的子類,在子類中重寫abstract類中的abstract方法(子類中重寫的方法不再是abstract方法),然後就可以只宣告一個abstract類,再利用 上轉型物件 對其重寫的方法進行呼叫。這樣就可以實現宣告的一個變數可以應對多種不同的變化。
來看一個例項的應用:(求柱體體積)
abstract類及其子類:
public abstract class Geometry { public abstract double getArea();//只是單純的構造了一個abstract方法,不用加任何東西。 }
class Circle extends Geometry{ double r; Circle(double r){//建構函式 this.r = r; } public double getArea() { / /方法的重寫 return r * r * 3.14; } } class Rectangle extends
Geometry{ double a,b; Rectangle(double a,double b){ this.a = a; this.b = b; } public double getArea() { return a*b; } }
獲取柱體體積的類,不再依賴具體類,而是面向Geometry類:
public class Pillar {
Geometry bottom;//宣告Geometry物件(抽象物件) double hight; Pillar(Geometry
bottom,double h){//建構函式,獲取值 this.bottom = bottom; this.hight = h; } public double getVolume(){//返回體積值 if(bottom == null){ System.out.println("沒有底,無法計算面積"); return 0; } return bottom.getArea()*hight;//這裡的呼叫的getArea()函式根據對bottom的上轉型物件來確定。 } }
建立上轉型物件,確定其呼叫函式,輸出其值
public class Application {
public static void main(String[] args) { Pillar pillar; Geometry bottom; bottom = null; pillar = new Pillar(bottom,5); System.out.println("體積:" + pillar.getVolume()); bottom = new Circle(2);//上轉型物件 pillar = new Pillar(bottom,1); System.out.println("體積:" + pillar.getVolume());//呼叫的是Circle裡面的getVolume()。 bottom = new Rectangle(5,2);//上轉型物件 pillar = new Pillar(bottom,1); System.out.println("體積:" + pillar.getVolume());//呼叫的是Rectangle裡面的getVolume()。 } }
面向抽象程式設計的目的是為了應對使用者需求的變化,將某個類中經常因需求變化需要改動的程式碼分離出去。
面向抽象程式設計的核心是讓類中每種可能的變化對應的交給抽象類的一個子類去負責,從而讓類的設計者不再去關心具體的實現。