【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);
    }


}