1 Java 语 言 中 变 量 和 方 法 的 分 析 及 其 应 用 贺 军, 李 喜 梅 ( 怀 化 职 业 技 术 学 院 计 算 机 与 信 息 工 程 系, 怀 化 418000) 摘 要 : 详 细 分 类 说 明 了 变 量 和 方 法 的 概 念, 分 析 了 变 量 和 方 法 在 java 程 序 设 计 应 用 过 程 中 的 内 存 分 配 问 题 在 继 承 时 的 覆 盖 问 题 以 及 静 态 变 量 和 静 态 方 法 的 应 用 问 题, 并 给 出 了 部 分 典 型 案 例 本 文 的 研 究 可 以 提 供 java 程 序 开 发 人 员 在 程 序 设 计 过 程 中 恰 当 的 使 用 变 量 和 方 法 作 为 参 考, 保 证 开 发 出 来 的 程 序 简 洁 和 高 效 关 键 词 :java 语 言 ; 变 量 ; 方 法 ; 覆 盖 ; 隐 藏 Analysis and Application of Variables and Methods in Java Language HE Jun, LI Xi-Mei (Computer and Information Engineering Department, Huaihua Vocational and Technical College, Huaihua 418000, China) Abstract: This paper makes a detailed classification and illustrates the concept of variables and method, analyzes the variables and methods of memory allocation problem in Java programming design application process, the covering problems in the inheritance and the application problems of static variables and static methods. It also sets partial typical examples. This research can provide Java program developers appropriate use of variables and methods as reference in programming design process, and ensure the developed program is concise and high efficiency. Key words: Java language; variable; method; cover; hidden 1 引 言 在 程 序 运 行 时, 有 些 数 据 的 值 会 被 改 变, 在 使 用 前 必 须 被 临 时 存 储, 这 就 需 要 用 于 标 识 数 据 的 存 储 单 元, 也 就 是 变 量 方 法 是 描 述 实 现 某 个 特 定 功 能 所 需 的 数 据 及 进 行 的 运 算 和 操 作 变 量 和 方 法 是 编 程 语 言 中 非 常 重 要 的 概 念, 对 于 java 语 言 当 然 也 不 例 外 由 于 java 是 面 向 对 象 的 编 程 语 言,java 的 变 量 分 为 : 局 部 变 量 类 变 量 ( 静 态 变 量 ) 和 实 例 变 量,java 的 方 法 分 为 : 类 方 法 ( 静 态 方 法 ) 和 实 例 方 法 在 学 习 Java 语 言 和 使 用 Java 语 言 开 发 程 序 的 过 程 中, 只 有 了 解 和 掌 握 好 它 们 各 自 不 同 的 特 点 和 适 用 环 境, 我 们 才 能 充 分 利 用 好 java 这 个 工 具, 开 发 出 性 能 更 良 好 的 系 统 2 变 量 java 的 变 量 有 局 部 变 量 类 变 量 ( 静 态 变 量 ) 实 例 变 量 和 参 数 变 量 ( 方 法 参 数 构 造 函 数 参 数 和 异 常 处 理 参 数 ) 四 种 [1] (1) 局 部 变 量 是 定 义 在 块 内 方 法 体 内 的 变 量 这 种 变 量 的 作 用 域 是 以 块 和 方 法 为 单 位 的, 仅 在 定 义 该 变 量 的 块 内 或 方 法 体 内 有 效, 而 且 要 先 定 义 赋 值, 然 后 再 使 用, 即 不 允 许 超 前 使 用 局 部 变 量 在 方 法 每 次 被 调 用 时 重 新 初 始 化, 与 上 次 的 调 用 无 关 (2) 类 变 量 是 定 义 在 类 内 或 接 口 内 方 法 外 且 用 static 修 饰 符 修 饰 的 变 量 类 变 量 又 称 为 静 态 变 量 类 变 量 是 类 的 变 量, 不 属 于 任 何 一 个 类 的 具 体 实 例 对 象 不 是 保 存 在 某 个 对 象 的 内 存 空 间 中, 而 是 保 存 在 类 的 内 存 区 域 的 公 共 存 储 单 元 中 换 句 话 说 : 对 于 类 的 任 何 一 个 具 体 对 象 而 言, 类 变 量 都 是 一 个 公 共 的 存 储 单 元, 任 何 一 个 类 的 对 象 访 问 它, 取 到 的 都 是 相 同 的 数 值 ; 同 样, 任 何 一 个 类 的 对 象 去 修 改 它, 也 都 是 对 同 一 内 存 单 元 进 行 操 作 类 变 量 可 以 通 过 类 名 直 接 访 问, 也 可 以 通 过 对 象 来 引 用, 两 种 方 法 的 结 果 是 相 同 的 (3) 实 例 变 量 定 义 在 类 内 方 法 外 但 不 用 static 1 收 稿 时 间 :2011-01-09; 收 到 修 改 稿 时 间 :2011-02-16 228 经 验 交 流 Experiences Exchange
2011 年 第 20 卷 第 7 期 http://www.c-s-a.org.cn 计 算 机 系 统 应 用 修 饰 符 修 饰 的 变 量 实 例 变 量 是 属 于 类 创 建 的 具 体 对 象 的 保 存 在 具 体 对 象 的 内 存 区 域 的 存 储 单 元 中, 对 于 不 同 的 对 象 来 说, 实 例 变 量 的 存 储 单 元 是 不 同 的 内 存 单 元 同 样, 一 个 类 的 不 同 的 对 象 去 修 改 属 于 本 对 象 的 实 例 变 量 也 是 针 对 不 同 的 内 存 单 元 进 行 操 作 的 实 例 变 量 只 能 通 过 对 象 来 引 用 (4) 参 数 变 量 分 为 方 法 参 数 构 造 函 数 参 数 和 异 常 处 理 参 数 方 法 参 数 是 用 来 传 入 方 法 体 的, 构 造 函 数 参 数 是 用 来 传 入 构 造 函 数 的, 异 常 处 理 参 数 是 用 来 传 入 一 个 try 语 句 中 的 catch 块 的 [2] 因 为 局 部 变 量 在 查 找 时 首 先 被 查 找, 因 此 若 某 一 局 部 变 量 与 类 变 量 或 实 例 变 量 同 名 时, 则 该 类 变 量 或 实 例 变 量 在 方 法 体 内 ( 或 程 序 块 内 ) 被 暂 时 屏 蔽 起 来, 只 有 退 出 这 个 方 法 ( 或 程 序 块 内 ) 后, 类 变 量 或 实 例 变 量 才 起 作 用 局 部 变 量 类 变 量 和 实 例 变 量 的 应 用 和 区 别 请 参 看 如 下 的 例 子 class MyObject static short s=400;// 类 变 量, 可 以 用 类 名 和 具 体 对 象 名 两 种 方 法 来 引 用 int i=200;// 实 例 变 量, 只 能 用 具 体 的 对 象 来 引 用 void f() System.out.println("s="+s); System.out.println("i="+i); short s=300;// 局 部 变 量 与 类 变 量 同 名, 在 方 法 体 内, 屏 蔽 类 变 量 int i=100;// 局 部 变 量 与 实 例 变 量 同 名, 在 方 法 体 内, 屏 蔽 实 例 变 量 double d=1e100;// 局 部 变 量 System.out.println(" 方 法 体 内 局 部 变 量 s="+s); System.out.println(" 方 法 体 内 局 部 变 量 i="+i); System.out.println("d="+d); public class variables public static void main(string args[]) System.out.println(" 用 类 名 MyObject 调 用 的 类 变 量 s="+myobject.s); /* System.out.println(" 用 类 名 MyObject 调 用 实 例 变 量 i="+myobject.i); // 这 种 书 写 方 法 是 错 误 的, 因 为 实 例 变 量 i 只 能 通 过 对 象 来 引 用 */ MyObject myobject=new MyObject(); // 用 具 体 对 象 myobject 来 引 用 类 变 量 s System.out.println(" 用 具 体 对 象 myobject 调 用 的 类 变 量 s="+myobject.s); // 用 具 体 对 象 myobject 来 引 用 实 例 变 量 i, 是 正 确 的 System.out.println(" 用 具 体 对 象 myobject 调 用 的 实 例 变 量 i="+myobject.i); myobject.f();// 调 用 方 法 用 类 名 MyObject 调 用 的 类 变 量 s=400 用 具 体 对 象 myobject 调 用 的 类 变 量 s=400 用 具 体 对 象 myobject 调 用 的 实 例 变 量 i=200 s=400 i=200 方 法 体 内 局 部 变 量 s=300 方 法 体 内 局 部 变 量 i=100 d=1.0e100 3 方 法 java 中 的 方 法 有 类 方 法 ( 静 态 方 法 ) 和 实 例 方 法 (1) 类 方 法 是 定 义 在 类 中 用 static 修 饰 并 且 属 于 整 个 类 的 方 法 类 方 法 可 以 使 用 类 名 直 接 调 用, 也 可 以 使 用 某 一 个 具 体 的 对 象 名 来 调 用 类 方 法 只 能 处 理 类 变 量 或 调 用 类 方 法, 类 方 法 中 不 能 访 问 实 例 变 量 和 实 例 方 法 如 果 类 方 法 被 允 许 处 理 实 例 变 量 和 实 例 方 法, 当 类 方 法 被 调 用 而 实 例 不 存 在 时, 显 而 易 见 程 序 运 行 将 会 出 现 错 误 (2) 实 例 方 法 是 定 义 在 类 中 不 用 static 修 饰 属 于 某 一 个 具 体 对 象 的 方 法 实 例 方 法 只 能 用 某 一 个 具 体 的 对 象 名 来 调 用 实 例 方 法 可 以 访 问 实 例 变 量 和 实 例 方 法, 也 可 以 处 理 类 变 量 和 调 用 类 方 法 类 方 法 和 实 例 方 法 的 应 用 和 区 别 请 参 看 如 下 的 Experiences Exchange 经 验 交 流 229
例 子 class A int i; // 实 例 变 量 static int j; // 类 变 量 void seti(int x) i=x; System.out.println("i="+i); setj(45); // 此 处 在 实 例 方 法 seti() 中 调 用 类 方 法 setj(), 正 确 static void setj(int y) j=y; System.out.println("j="+j); /* i=y; // 此 处 错 误, 类 方 法 中 不 能 处 理 实 例 变 量 seti(y);// 此 处 错 误, 类 方 法 中 不 能 调 用 实 例 方 法 */ public static void main(string args[]) A a1=new A(); // 创 建 类 对 象 a1 A.j=2; // 用 类 名 为 类 变 量 赋 值 a1.j=3; // 用 对 象 名 为 类 变 量 赋 值 A.setj(3); // 用 类 名 直 接 调 用 类 方 法 a1.i=4; // 用 对 象 名 为 实 例 变 量 赋 值 a1.seti(4); // 用 对 象 名 调 用 实 例 方 法 j=3 i=4 j=45 4 变 量 和 方 法 的 应 用 4.1 变 量 和 方 法 内 存 中 的 分 配 (1) 类 变 量 : 在 程 序 加 载 时 系 统 就 为 它 在 堆 中 开 辟 了 内 存, 堆 中 的 内 存 地 址 存 放 于 栈 以 便 于 高 速 访 问 类 变 量 的 生 命 周 期 一 直 持 续 到 整 个 系 统 关 闭 (2) 实 例 变 量 : 当 你 使 用 java 关 键 字 new 的 时 候, 系 统 在 堆 中 开 辟 并 不 一 定 是 连 续 的 空 间 分 配 给 实 例 变 量, 然 后 根 据 零 散 的 堆 内 存 地 址, 通 过 哈 希 算 法 换 算 为 一 长 串 数 字 以 表 征 这 个 变 量 在 堆 中 的 物 理 位 置 实 例 变 量 的 生 命 周 期, 当 实 例 变 量 的 引 用 丢 失 后, 将 被 GC( 垃 圾 回 收 器 ) 列 入 可 回 收 名 单 中, 但 并 不 是 马 上 就 释 放 堆 中 内 存 (3) 局 部 变 量 : 局 部 变 量, 由 声 明 在 某 方 法, 或 某 代 码 段 里 ( 比 如 for 循 环 ), 执 行 到 它 的 时 候 在 栈 中 开 辟 内 存, 当 局 部 变 量 一 但 脱 离 作 用 域, 内 存 立 即 释 放 (4) 方 法 : 方 法 存 储 在 栈 区, 生 命 周 期 只 限 于 方 法 被 放 在 栈 上 的 这 段 时 间 ( 也 就 是 方 法 调 用 直 至 执 行 完 毕 为 止 ) 4.2 变 量 和 方 法 在 继 承 时 的 覆 盖 在 类 的 继 承 中, 如 果 子 类 新 增 的 成 员 名 与 父 类 成 员 相 同, 则 称 为 成 员 覆 盖 或 成 员 隐 藏 在 子 类 中 定 义 与 父 类 同 名 成 员 的 目 的, 是 用 来 修 改 父 类 的 属 性 和 行 为 的 (1) this 的 使 用 一 个 对 象 中 的 方 法 一 般 可 以 直 接 访 问 同 一 对 象 的 成 员 变 量 但 是, 有 时 候 方 法 体 内 部 定 义 的 变 量 和 成 员 变 量 名 字 相 同, 还 有 时 方 法 的 入 口 参 数 和 对 象 的 成 员 变 量 名 字 相 同, 那 么 就 需 要 将 三 者 区 别 清 楚 因 此, 专 门 用 this 来 指 明 当 前 对 象 的 成 员 变 量 或 当 前 对 象 的 方 法 由 于 this 代 表 类 的 某 个 实 例, 所 以 静 态 成 员 不 能 用 this 来 引 用, 静 态 成 员 可 以 通 过 类 名 前 缀 来 引 用 [3] (2) super 的 使 用 在 Java 中, 由 父 类 派 生 子 类, 这 样, 子 类 的 成 员 变 量 可 能 和 父 类 的 成 员 变 量 名 字 相 同, 子 类 的 方 法 也 可 能 和 父 类 的 方 法 一 样 当 需 要 调 用 父 类 的 同 名 方 法 或 使 用 父 类 的 同 名 变 量 时, 在 子 类 中 可 用 关 键 字 super 作 前 缀 来 指 明 父 类 的 成 员 变 量 和 方 法 需 要 注 意 的 是, super 不 能 用 于 静 态 方 法 中, 在 静 态 方 法 中, 父 类 的 静 态 成 员 可 以 通 过 类 名 前 缀 来 引 用 [4] (3) 变 量 和 方 法 的 覆 盖 的 使 用 java 语 言 程 序 设 计 中, 实 例 变 量 和 类 变 量 能 被 隐 藏, 被 子 类 的 同 名 变 量 成 员 隐 藏 ; 局 部 变 量 和 各 种 参 数 永 远 不 会 被 隐 藏 ; 实 例 方 法 被 覆 盖, 静 态 方 法 被 隐 藏 [2] 请 参 看 如 下 的 例 子 230 经 验 交 流 Experiences Exchange
2011 年 第 20 卷 第 7 期 http://www.c-s-a.org.cn 计 算 机 系 统 应 用 class Base int x = 1; // 实 例 变 量 static int y=2; // 类 变 量 int z=3; // 实 例 变 量 int method() // 实 例 方 法 return x; static String greeting() // 类 方 法 return "Goodnight"; class Subclass extends Base int x = 4; // 与 父 类 同 名 的 实 例 变 量 int y=5; // 与 父 类 同 名 的 实 例 变 量 static int z=6; // 与 父 类 同 名 的 类 变 量 int method() // 与 父 类 同 名 的 实 例 方 法 return x; static String greeting() // 与 父 类 同 名 的 类 方 法 return "Hello"; public class Test public static void main(string[] args) Subclass s=new Subclass(); System.out.println(s.x + " " + s.y +" "+ s.z); // 隐 藏 与 父 类 同 名 的 变 量 System.out.println(s.method()); // 使 用 子 类 中 的 实 例 方 法, 覆 盖 了 父 类 中 同 名 的 实 例 方 法 System.out.println(s. greeting ()); // 使 用 子 类 中 的 类 方 法, 隐 藏 了 父 类 中 同 名 的 类 方 法 Base b =(Subclass)s; System.out.println(b.x + " " + b.y +" "+ b.z); // 使 用 父 类 中 的 变 量 System.out.println(b.method()); // 使 用 子 类 中 的 实 例 方 法, 覆 盖 了 父 类 中 同 名 的 实 例 方 法 System.out.println(b. greeting ()); // 使 用 父 类 中 的 类 方 法 4 5 6 4 Hello 1 2 3 4 Goodnight 4.3 静 态 变 量 和 静 态 方 法 的 应 用 java 语 言 中 没 有 全 局 变 量 和 全 局 函 数 的 概 念, 但 静 态 变 量 在 java 程 序 中 充 当 了 全 局 变 量 的 角 色, 同 样, 静 态 方 法 类 似 于 全 局 函 数 [5] java 程 序 中 应 该 什 么 时 候 用 静 态 成 员 什 么 时 候 用 非 静 态 成 员 呢? 这 要 看 情 况 而 定, 比 如, 在 java API 的 Math 类 中, 几 乎 所 有 变 量 和 方 法 都 是 静 态 的, 而 System 类 中 大 部 分 方 法 也 是 静 态 的 因 为 这 样 的 类, 通 用 性 很 强, 重 用 性 很 高, 而 且 关 键 的 一 点 是 改 动 的 可 能 性 很 小, 这 种 时 候 比 较 适 合 用 静 态 变 量 和 静 态 方 法, 这 样 节 省 了 初 始 化 所 消 耗 的 资 源, 也 方 便 使 用 比 如 System 类 中 的 out 方 法, 使 用 时 不 必 要 在 每 次 输 出 的 时 候 创 建 一 个 System 类 的 实 例 而 消 耗 更 多 资 源 因 此, 在 java 程 序 设 计 中 应 该 将 一 些 比 较 常 用 而 且 不 会 随 他 的 实 例 而 变 化 的 变 量 和 方 法 设 置 成 静 态 的 尽 管 静 态 成 员 的 使 用 有 很 多 优 点, 但 也 不 是 所 有 的 成 员 都 适 合 设 置 成 静 态 成 员 比 如, 当 某 些 类 的 通 用 性 不 强 时 不 太 适 合 使 用 静 态 成 员, 因 为 静 态 成 员 会 在 整 个 类 的 生 命 周 期 中 一 直 存 在 从 而 影 响 系 统 的 性 能 请 参 看 如 下 的 例 子 class circle int r; public circle (int r) this.r=r; Experiences Exchange 经 验 交 流 231
public int getr() return r; // 返 回 当 前 圆 的 半 径, 根 据 每 一 个 实 例 的 不 同, 返 回 不 同 的 值 所 以 此 时 不 能 使 用 静 态 方 法, 只 能 使 用 实 例 方 法 5 结 语 变 量 和 方 法 是 java 语 言 中 重 要 的 概 念, 恰 当 的 使 用 变 量 和 方 法 可 以 保 证 程 序 的 简 洁 和 高 效 本 文 详 细 讨 论 了 变 量 和 方 法 的 分 类 及 其 使 用 情 况, 并 给 出 了 部 分 实 例 希 望 本 文 的 研 究 对 于 java 程 序 设 计 人 员 准 确 使 用 java 语 言 中 变 量 和 方 法 具 有 一 定 的 帮 助 参 考 文 献 1 李 占 波, 姬 莉 霞, 王 海 玲, 欧 研. 程 序 设 计 基 础 (java 版 ). 北 京 : 中 国 铁 道 出 版 社, 2007.80 81. 2 CAD 教 育 网.Java 中 的 方 法 和 变 量 在 继 承 时 的 覆 盖. 北 京 : http://www.cadedu.com/ 编 程 开 发.java 语 言 编 程, 2010.02. 06. 3 李 尊 朝, 苏 军.Java 语 言 程 序 设 计. 第 2 版. 北 京 : 中 国 铁 道 出 版 社, 2009.97 98. 4 刘 培 文.java 程 序 设 计 教 程. 北 京 : 北 京 科 海 电 子 出 版 社, 2009.88 89. 5 张 素 珍, 耿 磊.Java 语 言 静 态 变 量 和 静 态 方 法 的 分 析 及 其 应 用 研 究. 计 算 机 系 统 应 用, 2006,15(5):84 86. ( 上 接 第 227 页 ) 2 De Bra PME, Post RDJ. Information retrieval in the World Wide Web: Making client-based searching feasible. Proc. 1st International World Wide Web Conference (Geneva), 1994. 3 Hersovici M, Jacovi M, Maarek YS, et al. The shark-search algorithm An application: Tailored Web site mapping. Proc. 7th Intl. World-Wide Web Conference, 1998. 4 Chakrabarti S, van den Berg M, Dom B. Focused crawling: A new approach to topic-specific Web resource discovery. Computer Networks 1999,31:1623 1640. 5 Aggarwal CC, Al-Garawi F, Yu PS. Intelligent crawling on the World Wide Web with arbitrary predicates. Proc. 10th International World Wide Web Conference.2001.96 105. 6 Michelangelo Diligenti, Frans Coetzee, Steve Lawrence et al. Focused crawling using context graphs. Proc. Very Large Data Bases 2000 (VLDB 2000). 7 Michael Chau, Hsinchun Chen. Comparison of three vertical search spiders. IEEE Computer, 2003,36(5). 8 Chakrabarti S. Integrating the Document Object Model with hyperlinks for enhanced topic distillation and information extraction. 10th International World Wide Web Conference, 2001. 9 Chen J, Zhou BY, Shi J, et al. Function-Based Object Model Towards Website Adaptation. Proc. of the 10th International World Wide Web Conference, 2001. 10 Zou J, Le D, Thoma GR. Online medical journal article layout analysi. Proc. SPIE, 2007, 6500: 1 12. 11 Cai D, Yu SP, Wen JR, et al. VIPS: A Vision-based Page Segmentation Algorithm. Microsoft Technical Report, 2003, MSR-TR-2003 79. 232 经 验 交 流 Experiences Exchange