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.769毫秒