第7章 复用类

本章:描述了复用三种方法:组合、继承和代理

一、组合

组合只需要将对象引用置于新类即可。初始化引用的四种途径:

public class Bath {
  private String s1 = "Happy",s2, s3, s4;// Way 1:Initializing at point of definition:
  public Bath() {
    s2 = "New";  // Way 2: Initializing in the constructor
  } 
  { s3= "Year"; }  // Way 3: Instance initialization:
  public String toString() {
    if(s4 == null) // Way 4: Delayed initialization:
      s4 = "Everybody";
    return
      "s1 = " + s1 + "\n" +
      "s2 = " + s2 + "\n" +
      "s3 = " + s3 + "\n" +
      "s4 = " + s4 + "\n" +
  } 
}

如上述程序所示,可以在程序的四个位置初始化对象引用:

  • 在定义对象的地方,则其可以在构造器调用之前被初始化
  • 在构造器中初始化
  • 实例初始化
  • 惰性初始化,在实际使用时才初始化

二、继承

继承即按照现有的类的类型来创造新类,无需改变现有类,在现有类的基础上添加新的代码。
extends 关键字来表示。
Java中若没有显示的继承,则都是隐式的继承Object类。
继承的一般规则为所有数据为private所有方法为public
调用基类则用super关键字

  1. 基类在导出类构造器访问其本身之前,就已经完成了初始化,构建过程从基类向外扩散。
  2. 若每个类都有不带参数的默认构造器,则不需要super 即可调用基类构造器语句。
  3. 构造了导出类的首件事情即需要调用基类的构造器。

三、代理

Java没有直接为其提供支持,但可以用组合实现代理的效果。代理一般用于当两个类不符合继承的关系,但是又想在一个类中取得对另一个类方法的直接使用权(一般只有子类可以)。

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() {}
} ///:~
public class SpaceShipDelegation {
  private String name;
  private SpaceShipControls controls =
    new SpaceShipControls();
  public SpaceShipDelegation(String name) {
    this.name = name;
  }
  // Delegated methods:
  public void back(int velocity) {
    controls.back(velocity);
  }
  public void down(int velocity) {
    controls.down(velocity);
  }
  public void forward(int velocity) {
    controls.forward(velocity);
  }
  public void left(int velocity) {
    controls.left(velocity);
  }
  public void right(int velocity) {
    controls.right(velocity);
  }
  public void turboBoost() {
    controls.turboBoost();
  }
  public void up(int velocity) {
    controls.up(velocity);
  }
  public static void main(String[] args) {
    SpaceShipDelegation protector =
      new SpaceShipDelegation("NSEA Protector");
    protector.forward(100);
  }
} ///:~

try … finally 关键字
把需要特殊处理的部分带入try下方,而无论try块怎么退出,finally 子句中的代码总是要被执行的。

在清理方法中,对基类和子类清理方法的顺序,要先清理子类,最后是基类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值