【Java】組合 繼承 代理
阿新 • • 發佈:2020-08-18
組合 繼承 代理
組合語法:
只需要將物件引用置於新類中即可。例如,你需要某個物件,而且它還要有多個String物件,幾個基本資料,以及另一個類的物件。
類中域為基本型別時能夠被自動初始化為0,但是物件引用會被初始化為null,編譯器並不是簡單地為每一個引用都建立預設物件,這一點非常有意義,如果那樣的話會增加許多不必要的負擔。
想初始化這些引用,可以在程式碼中的下列位置進行:
- 定義物件的地方。這意味著它們能夠在構造器被呼叫之前被初始化
- 在類的構造器中
- 就在正要使用這些物件之前,稱為惰性初始化(Delayed Initialization)。在生成物件不值得及不必每次都生成物件的情況下,這種方式可以減少額外的負擔。
- 使用例項初始化
繼承語法:
繼承是所有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); } }