1. 程式人生 > 實用技巧 >【Java】組合 繼承 代理

【Java】組合 繼承 代理

組合 繼承 代理

組合語法:

只需要將物件引用置於新類中即可。例如,你需要某個物件,而且它還要有多個String物件,幾個基本資料,以及另一個類的物件。

類中域為基本型別時能夠被自動初始化為0,但是物件引用會被初始化為null,編譯器並不是簡單地為每一個引用都建立預設物件,這一點非常有意義,如果那樣的話會增加許多不必要的負擔。

想初始化這些引用,可以在程式碼中的下列位置進行:

  1. 定義物件的地方。這意味著它們能夠在構造器被呼叫之前被初始化
  2. 在類的構造器中
  3. 就在正要使用這些物件之前,稱為惰性初始化(Delayed Initialization)。在生成物件不值得及不必每次都生成物件的情況下,這種方式可以減少額外的負擔。
  4. 使用例項初始化

繼承語法:

繼承是所有OOP語言和Java語言不可或缺的一部分。當建立一個類的時候總是在繼承,因此,除非已明確指出從哪裡繼承,否則就是隱式的從Object繼承

組合的語法比較平實,但是繼承使用的是一種特殊的語法:書寫extends實現。這麼做會自動得到基類中的所有域和方法。

使用基類中定義的方法以及對他進行修改是可行的,呼叫基類方法用super關鍵字。繼承過程中不一定非得使用基類的方法,也可以在匯出類中新增新方法。

代理:

第三種關係稱為代理,Java語言並沒有提供對他的直接支援。這是繼承與組合之間的中庸之道。因為我們將一個成員物件置於所要構造的類中(就像組合),但與此同時我們在新類中暴露了該成員物件的所有方法(就像繼承)。我們使用代理時可以擁有更多的控制力,因為我們可以選擇只提供在成員物件中的方法的某個子集。

太空船控制模組:

package reusing;

public class SpaceShipControls {
    void up(int velocity) {}
    void down(int velocity) {}
    void left(int velocity) {}
    void right(int velocity) {}
    void forward(int velocity) {}
    void back(int velocity) {}
    void turboBoost(int velocity) {}
}

package reusing;

public class SpaceShipDelegation {
    private String name;
    private SpaceShipControls controls = new SpaceShipControls();
    public SpaceShipDelegation(String name) {
        this.name = name;
    }
    //Delegated Methods
    public void up(int velocity) {
        controls.up(velocity);
    }
    public void down(int velocity) {
        controls.down(velocity);
    }
    public void left(int velocity) {
        controls.left(velocity);
    }
    public void right(int velocity) {
        controls.right(velocity);
    }
    public void forward(int velocity) {
        controls.forward(velocity);
    }
    public void back(int velocity) {
        controls.back(velocity);
    }
    public void turboBoost(int velocity) {
        controls.turboBoost(velocity);
    }

    @Override
    public String toString() {
        return name;
    }

    public static void main(String[] args) {
        SpaceShipDelegation shadow = new SpaceShipDelegation("Shadow");
        shadow.up(100);
        System.out.println(shadow);
    }


}