Java 版 (精华区)

发信人: angle (finder), 信区: Java
标  题: 内 嵌 类 简 介(4)
发信站: 哈工大紫丁香 (Mon Jun 21 18:34:14 1999), 转信

4 关 于“this”

   当 你 写JAVA 代 码 时, 有 时 不 可 避 免 地 要 明 确 地 引 用
 定 义目 前 对 象实 例 的 实 例 变 量。 你 解 决 的 办 法 是 在 
变 量 名 前 加 一 个“this” 限定 词。this.x这 个 名 字 就 是 指
 对 象 的this 实 例 中 的 变 量 名。 很 显 然, 如 果 你 在内 嵌 类 中
 引 用this, 它 是 指 内 嵌 类 本 身 所 定 义 的 域 或 变 量。 
然 而, 我 们 刚刚 解 决 了使 用 包 容 类 — —rootNode — — 的
 实 例 变 量 的 声 明, 如 果 我 们 只 需在 内 嵌 类中 定 义 一 个
 名 字 也 是rootNode 的 变 量, 我 们 如 何 区 分 它 们 呢 ? 答
案 是 还 有另 外 一 个 新 的this: qualified this。

   关 于this 关 键 词 有 一 个 限 定 词。 该 限 定 词 的 定 义 是
 你 可任 何 一 个 包容 类 的 名 字 作 为this 的 限 定 词。 在 我 
们 假 设 的 定 义 其 自 己 的rootNode 域 的 内嵌 类 这 一 例 子 
中, 内 嵌 类 的 值 通 常 是this.rootNode, 包 容 类 中 的 值能
 用BinarySearchTree.this.rootNode 来 调 用。 你 可 以 看 到 这
 个 名 字 始 终 明确, 因为JAVA1.1 新 规 定 内 嵌 类 不 能 与 它 
的 任 何 一 个 包 容 类 同 名。

    你 很 容 易 搞 混 到 底 在 引 用 哪 个 类 变 量, 我 建 议 你 保 持 你
 的 实 例 变 量有 明 确 的 名 字。 幸 运 的 是, 只 有 编 译 器 
的 设 计 者 才 必 须 知 道 给本 身 是 匿名 内 嵌 类 的 包 容 类 
中 的 实 例 变 量 取 了 什 么 名 字。

   5 另 外 一 些 要 考 虑 的 问 题


   JAVA 语 言 新 用 户 们 经 常 碰 到 的 问 题 是 缺 乏JAVA 方 
法 调 用引 用 传 递语 义。 解 决 如 何 获 得 引 用 传 递 语 义 这 
一 问 题 的 方 法 是 建 立 指 向 一 个 可 设置 的, 并 且 以 后 
可 以 检 索 的 值 的 类。 这 样 做 通 常 很 麻 烦, 因 为 须 建 立 一
 个 完 整 的 类 才 能 从 方 法 调 用 中 返 回 多 个 值。

  考 虑 一 下 下 面 这 段 代 码 中 内 嵌 类 是 如 何 解 决 这 个
 问 题

    public class PointSample {
     public void samplePoint(IntSetter x, IntSetter y, FloatSetter m) {
         x.set(10);
         y.set(100);
         m.set(5.5f);
       }
     }

          上 面 的 代 码 要 返 回 三 个 值:x,y, 和m。 因 此 我
 们 没 有 传 递部 类 型, 而是 用IntSetter 或FloatSetter 类 型 
的 对 象 引 用。IntSetter 的 定 义 如 下:

     public interface IntSetter {
       public void set(int value);
      }

   你 可 以 看 到, 这 只 是 定 义 了set 方 法 的 接 口, 该 方 
法 选 取一 个 整 数 值 并把 它 设 置 好。FloatSetter 的 设 计 留
 给 读 者 作 练 习。 现 在 考 虑 一 下 面 的 程 序
 例 子:

   public class example {
    int         xPos = 0, yPos = 0;
    float       magnitude = 1.0f;
    public void doit() {
      PointSample ps = new PointSample();
      System.out.println("Shows off an anonymous inner class.");
      System.out.println("X,Y = ["+xPos+", "+yPos+"], Mag = "+magnitude);
      ps.samplePoint(new IntSetter() {public void set(int a) { xPos = a; }},
          new IntSetter() { public void set(int a) { yPos = a; }},
          new FloatSetter() { public void set(float a) { magnitude = a;}});
      System.out.println("X,Y = ["+xPos+", "+yPos+"], Mag = "+magnitude);
   }

   public static void main(String args[]) {
      example ex = new example();
      ex.doit();
    }
   }

          main 方 法 所 做 的 是 建 立example 对 象 的 一 个 实
 例, 并 且 调 用其 中 的doit方 法。 doit 方 法 更 有 趣: 它 建
 立 了 一 个PointSample 对 象, 并 用 三 个内 嵌 类 调用 其samplePoint 方 法。

   内 嵌 类 的 实 现 允 许 起 用samplePoint 方 法 简 单 地 把 结 
果 存 到调 用 类( 这儿 是example) 的 实 例 变 量 中。 这 项 技
 术 省 去 了 返 回 含 有 值 的 类 的中 间 步 骤, 它 把 类 中 的 
值 去 除, 并 存 到 实 例 变 量 中。 这 个 例 子 中 实 现功 能 有 点
 象 引 用 传 递, 用JAVA 的 术 语 来 说 意 思 是 它 传 递 了 一 
个 能 改 变 引用对 象 的状 态 的 操 作。 一 旦 你 掌 握 了 它 的
 诀 窍 后, 你 会 发 现 内 嵌 类 带来了 无 穷 无尽 的 可 能 性。
6 结 束 语

          内 嵌 类 使JAVA 语 言 可 以 清 晰 地 表 达 程 序 员 的 
意 图 而 不 会增 加 混 乱。因 为 它 们 是 在 编 译 器 中 实 现 的
 内 嵌 类 在 技 术 上 并 不 代 表 对JAVA(TM)平 台 的 改 变, 但
 它 们 肯 定 改 变 了JAVA 语 言。 当 内 嵌 类 与Core Reflection API
 组 合 在 一 起 时, 它 们 能 使 我 们 建 立 动 态 链 接 的 回 调
 机 制。AWT 中新 的 事 件模 块 是 这 种 机 制 的 一 个 很 好 的 例 子。

    



--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: www-post@bbs.hit.edu]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.602毫秒