|
|
当 你 用 点 操 作 符 调 用 一 个 对 象 实 例 的 成 员 函 数 时, 对 象 实 例 所 属 的 类 在 编 译 时 要 被 检 查, 以 确 保 调 用 的 成 员 函 数 在 该 类 中 是 存 在 的。 在 运 行 时, 对 象 实 例 可 以 指 向 所 声 明 类 型 的 子 类 的 实 例。 在 这 ?copy; 情 况 下, 如 果 子 类 覆 盖 了 要 调 用 的 成 员 函 数,Java就 用 实 例 来 决 定 调 用 哪 一 个 成 员 函 数。 如 下 面 的 例 子, 两 个 类 是 子 类 和 超 类 的 关 系, 子 类 覆 盖 了 超 类 的 成 员 函 数。
class A { void callme( ) { System.out.println(\"在A的callme成 员 函 数 里\"); } } class B extends A { void callme( ) { System.out.println(\"在B的callme成 员 函 数 里\"); } } class Dispatch { public static void main(String args[]) { A a = new B( ); a.callme( ); } } 有 趣 的 是, 在 成 员 函 数main里, 我 们 把 变 量a声 明 为 类 型A, 然 后 把 类B的 一 个 实 例 存 放 到 它 上 面。 我 们 在a上 调 用 成 员 函 数callme,Java编 译 器 确 定 在 类A确 实 有 成 员 函 数callme, 但 是 在 运 行 时, 由 于a事 实 上 是B的 实 例, 所 以 调 用B的callme, 而 不 调 用A的。 下 面 是 运 行 结 果: C:\\>java Dispatch 在B的callme成 员 函 数 里
![[:E]](/faces/13.gif) ![[:E]](/faces/13.gif) |
|