Java編程思想讀書筆記第八章

Java三大特性

封裝、繼承、多態是面向對象程序設計語言的三種基本特徵。
封裝是通過合併特徵和行爲來創建新的數據類型,再配合權限控制把接口和實現分離。在此基礎上爲了便於代碼的複用又產生了繼承,子類通過extends關鍵字繼承來自於父類的非私有成員變量和方法,同時可以擴展自己的成員變量和方法。因爲繼承允許將多種從同一基類導出的類型視爲基類類型來處理,也就是一份代碼可以毫無差別的運行在不同類別之上,這就形成了多態,多態可以消除類型之間的耦合關係。

方法的調用綁定

將一個方法調用同一個方法主體關聯起來被稱作綁定,在編譯時綁定稱作前期綁定,在運行時綁定稱作後期綁定。

//polymorphism/shape/Shape.java
class Shape {
    public void draw() {}
    public void erase() {}
}
class Circle extends Shape {
    @Override
    public void draw() { System.out.println("Circle.draw()"); }
    @Override
   public void erase() { System.out.println("Circle.erase"); }
}
class Square extends Shape {
    @Override
    public void draw() { System.out.println("Square.draw()"); }
    @Override
    public void erase() { System.out.println("Square.erase"); }
}
class Triangle extends Shape {
    @Override
    public void draw() { System.out.println("Triangle.draw()"); }
    @Override
    public void erase() { System.out.println("Triangle.erase"); }
}
public class RandomShapeGenerator {
    private Random rand = new Random(47);
    public Shape next() {
        switch (rand.nextInt(3)) {
            case 0: return new Circle();
            case 1: return new Square();
            case 2: return new Triangle();
        }
        return new Shape();
    }
}
//polymorphism/shape/Shapes.java
public class Shapes {
    private static RandomShapeGenerator gen =
            new RandomShapeGenerator();
    public static void main(String[] args) {
        Shape[] s = new Shape[9];
        for (int i = 0; i < s.length; i++) {
            s[i] = gen.next();
        }
        for (Shape shp : s) {
            shp.draw();
        }
    }
}/*output
Triangle.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Square.draw()
Triangle.draw()
Circle.draw()
*/

每次調用next()方法時可以隨機生成一個Shape對象返回一個引用,在return語句裏使用到向上轉型。main()方法包含一個Shape數組,我們只知道擁有一些Shape,除此之外不會知道更具體的內容,然而在遍歷數組調用draw()方法時,卻發生了與特定類型有關的特定行爲。這是由後期綁定實現的,其含義就是在運行時根據對象的類型進行綁定,編譯器一直不知道對象的類型,但是方法的調用機制卻能找到正確的方法體。Java中除了static方法、private方法、final方法外都是後期綁定。

繼承與組合

通過對成員類型使用繼承技術的添加技巧,可以在運行時改變那些成員對象的類型和行爲,因此,可以在運行時改變組合而成的對象的行爲。所以組合比繼承更靈活,所以要優先選擇組合。

class Actor {
    public void act() {}
}
class HappyActor extends Actor {
    public void act() { System.out.println("HappyActor"); }
}
class SadActor extends Actor {
    public void act() { System.out.println("SadActor"); }
}
class Stage {
    private Actor actor = new HappyActor();
    public void change() { actor = new SadActor(); }
    public void performPlay() { actor.act(); }
}
public class Transmogrify {
    public static void main(String[] args) {
        Stage stage = new Stage();
        stage.performPlay();
        stage.change();
        stage.performPlay();
    }
}/*output
HappyActor
SadActor
*/

Stage對象包含Actor的引用,而引用可以在運行時與另一個不同的對象重新綁定起來,所以SadActor對象的引用可以在actor中被替代,然後performPlay()產生的行爲也隨之改變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章