10.5 可修改的对象

可通过给对象的属性赋值来修改对象的内容。例如,要移动矩形而不改变其尺寸,可修改属性 xy

  1. Rectangle box = new Rectangle(0, 0, 100, 200);
  2. box.x = box.x + 50;
  3. box.y = box.y + 100;

结果如图 10-3 所示。

{%}

图 10-3:显示最新属性值的状态图

我们可将这些代码封装到一个方法中后再进行泛化,让这个方法能够将矩形移动任何指定的距离:

  1. public static void moveRect(Rectangle box, int dx, int dy) {
  2. box.x = box.x + dx;
  3. box.y = box.y + dy;
  4. }

变量 dxdy 用于指定将矩形沿水平和垂直方向分别移多远。调用这个方法将修改作为实参传入的 Rectangle 对象。

  1. Rectangle box = new Rectangle(0, 0, 100, 200);
  2. moveRect(box, 50, 100);
  3. System.out.println(box);

将对象作为实参传递给方法以便修改十分有用,但也可能导致调试更加困难,因为并非在任何情况下都能清楚地知道哪些方法会修改其实参。

Java 提供了很多操作 PointRectangle 对象的方法,例如,translate 的效果与 moveRect 相同,但调用这个方法时,不是将 Rectangle 对象作为实参传递给它,而是用句点表示法:

  1. box.translate(50, 100);

这行代码对 box 指向的对象调用方法 translate,因此将直接更新对象 box

这个示例很好地演示了面向对象(object-oriented)编程:不是编写 moveRect 这样修改一个或多个实参的方法,而是用句点表示法对对象调用方法。