JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系
使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款
使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox 在 类 体 中, 声 明 代 表 相 应 属 性 的 变 量 属 性 容 量 实 际 保 存 金 额 域 成 员
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox int capacity ; 域 成 员 的 默 认 值 基 本 类 型,0; 引 用 类 型,null 属 性 容 量 实 际 保 存 金 额 域 成 员
在 声 明 域 成 员 时, 给 出 对 应 的 初 始 值 public class SaveBox int capacity = 100 ; 初 始 值 属 性 容 量 实 际 保 存 金 额 域 成 员
通 常, 使 用 关 键 字 private 修 饰 类 的 域 成 员 public class SaveBox private int capacity = 100 ; private 修 饰 的 优 点 实 现 数 据 隐 藏 保 护 数 据 安 全 避 免 ( 外 部 ) 对 内 部 数 据 成 员 的 随 意 修 改, 而 造 成 的 错 误 属 性 容 量 实 际 保 存 金 额 域 成 员 最 高 保 密 级 别!
关 键 字 public private 对 类 和 类 成 员 的 修 饰 作 用 public class SaveBox private int capacity = 100 ; 访 问 控 制 级 别 决 定 将 以 何 种 方 式 使 用 被 修 饰 的 目 标 属 性 容 量 实 际 保 存 金 额 域 成 员
在 Java 语 言 中, 存 在 四 种 访 问 级 别 访 问 控 制 级 别 public protected private 包 访 问 默 认 访 问 级 别 ( 不 明 确 指 定 访 问 级 别 ) 该 级 别 的 类 成 员 只 能 被 同 一 个 包 中 的 类 直 接 使 用
类 的 域 成 员 代 表 目 标 的 内 在 属 性 声 明 域 成 员 的 方 式 [ 访 问 控 制 级 别 ] 数 据 类 型 域 成 员 [ = 初 始 值 ] ; private int income = 10000 ; public long sangongconsumption = 47525400 ; 在 类 体 中, 声 明 域 成 员!
补 充 : 类 体 与 函 数 体 package cn.edu.shnu.www ; import java.util.scanner; public class Speed int x1 = 1 ; // 域 成 员 x1 public static void main(string[] args) int x2 = 0; // main 方 法 中 的 变 量 x2
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; // 容 量 private int amount = 0 ; // 实 际 保 存 金 额 属 性 容 量 实 际 保 存 金 额 域 成 员
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; // 容 量 private int amount = 0 ; // 实 际 保 存 金 额 动 作 在 类 体 中, 定 义 代 表 ( 完 成 ) 相 应 动 作 的 函 数 开 保 险 箱 关 保 险 箱 存 取 款 成 员 方 法
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; private int amount = 0 ; 动 作 开 保 险 箱 关 保 险 箱 存 取 款 public void open( ) System.out.println( The door is opened. ); 成 员 方 法
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; private int amount = 0 ; 动 作 开 保 险 箱 关 保 险 箱 存 取 款 public void close( ) System.out.println( The door is closed. ); public void open( ) System.out.println( The door is opened. );
类 的 成 员 方 法 代 表 目 标 的 各 种 行 为 在 类 体 中, 定 义 成 员 方 法 的 方 式 [ 访 问 控 制 级 别 ] 返 回 类 型 方 法 ( [ 形 参 列 表 ] ) private double area( double r ) return Math.PI * r * r ; 只 能 被 自 己 类 中 的 其 他 非 静 态 方 法 调 用 在 类 体 中, 定 义 成 员 方 法!
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; private int amount = 0 ; public void deposit( int money ) if(amount+money<=capacity) amount=amount+money; 动 作 开 保 险 箱 关 保 险 箱 存 取 款 存 款 取 款
使 用 class SaveBox 代 表 保 险 柜 public class SaveBox private int capacity = 100 ; private int amount = 0 ; public int withdrawal( int money ) if(amount-money>=0) amount=amount-money; return money; 动 作 开 保 险 箱 关 保 险 箱 存 取 款 存 款 取 款
Java class 是 创 建 事 物 ( 对 象 ) 的 模 板 public class SaveBox private int capacity = 100 ; private int amount = 0 ; public void close( ) System.out.println( The door is closed. ); public void open( ) System.out.println( The door is opened. ); public int withdrawal( int money ) if(amount-money>=0) amount=amount-money; return money; return 0; public void deposit( int money ) if(amount+money<=capacity) amount=amount+money;
使 用 关 键 字 new 创 建 目 标 类 的 对 象 实 例 方 式 类 名 对 象 = new 类 名 ( [ 参 数 列 表 ] ) ; Scanner keyboard = new Scanner( System.in ) ; SaveBox one = new SaveBox( ) ;
通 过 点 运 算 符, 访 问 目 标 对 象 的 公 共 成 员 方 式 对 象. 公 共 成 员 SaveBox one = new SaveBox( ) ; one.open( ) ; // 打 开 保 险 柜 one 的 门 // 生 产 出 一 台 称 为 one 的 保 险 柜 one.deposit( 50 ) ; 消 息 传 递 one.close( ) ;
在 类 外, 无 法 访 问 目 标 对 象 的 私 有 成 员 public class OilTable private int capacity = 1000; private double price = 8.2 ; private double unitprice( ) return price*1.2; public double pay( int gasoline ) double money=0.0; capacity=capacity-gasoline; public class GasStation public static void main(string[] args) OilTable js = new OilTable( ); double money = js.pay(100) ; System.out.println(" 应 付 款 : "+money); double x = js.unitprice( ) ; System.out.println(" 单 价 : "+ x ); js.price = 2.8 ; money=gasoline*unitprice( ); return money; OilTable 的 私 有 成 员
访 问 控 制 带 来 的 好 处 通 过 类 的 public 成 员 方 法 访 问 private 成 员 不 仅 保 护 了 域 成 员 ( 实 例 变 量 ), 使 其 不 会 接 受 非 法 值 同 时, 对 类 的 使 用 者 隐 藏 了 域 成 员 的 内 部 表 示 这 样, 只 要 public 方 法 的 声 明 没 有 变 化, 即 便 数 据 的 表 示 或 方 法 的 实 现 发 生 了 改 变, 那 么 也 无 需 改 变 客 户 实 现
保 存 在 域 成 员 中 的 数 据 是 否 会 被 其 他 同 类 对 象 所 共 享? public class SaveBox private int capacity = 100 ; private int amount = 0 ; public void deposit( int money ) if(amount+money<=capacity) amount=amount+money; public class GasStation public static void main(string[] args) SaveBox a = new SaveBox( ); SaveBox b = new SaveBox( ); a.deposit(50); b.deposit(60); 保 险 箱 a 和 b 中 的 钱 会 不 会 放 错?
隐 藏 在 类 中 的 this 引 用 在 类 体 中, 每 个 成 员 ( 域 成 员, 成 员 方 法 ) 都 通 过 隐 式 地 使 用 this 引 用, 访 问 自 身 在 类 体 中, 显 式 使 用 this 引 用 : this. 域 成 员 this. 成 员 函 数 ( [ 参 数 列 表 ] )
this 引 用 保 证 对 象 之 间 的 信 息 独 立 public class OilTable private int capacity = 1000; private double price = 8.2 ; public class OilTable private int capacity = 1000; private double price = 8.2 ; private double unitprice( ) return price*1.2; public double pay( int gasoline ) double money=0.0; private double unitprice( ) return price*1.2; public double pay( int gasoline ) double money=0.0; capacity=capacity-gasoline; this.capacity -= gasoline; money=gasoline*unitprice( ); return money; money=gasonline*this.unitprice( ); return money;
显 式 使 用 this 引 用, 避 免 域 成 员 与 成 员 函 数 参 数 之 间 的 命 名 冲 突 public class OilTable private int capacity = 1000; private double price = 8.2 ; 类 中 成 员 方 法 的 参 数 名 可 与 域 成 员 同 名 public void setprice(double price) this. price = price ; 域 成 员 被 同 名 参 数 屏 蔽 通 过 this, 显 式 访 问 域 成 员
模 拟 保 险 柜 的 java class SaveBox public class SaveBox private int capacity = 100 ; private int amount = 0 ; 保 险 柜 的 容 量 是 否 可 以 随 意 修 改? 如 何 保 证 相 应 的 域 成 员 不 被 修 改? 常 量 域 成 员 关 键 字 final
常 量 域 成 员 声 明 语 句 [ 访 问 级 别 ] final 数 据 类 型 常 量 [= 初 始 值 ] ; public final int capacity = 100 ;
模 拟 保 险 柜 的 java class SaveBox public class SaveBox private final int capacity = 100 ; private int amount = 0 ; capacity 是 类 SaveBox 的 私 有 常 量 域 成 员
如 何 修 改 域 成 员 的 数 据? public class SaveBox private final int capacity = 100 ; private int amount = 0 ; 修 改 域 成 员 数 据 的 方 式 声 明 语 句 公 共 成 员 方 法 构 造 方 法
构 造 方 法 是 类 中 的 一 组 特 殊 函 数 public class SaveBox public SaveBox( int money ) amount = money ; private final int capacity = 100 ; private int amount = 0 ; 方 法 名 与 类 名 完 全 一 致 没 有 返 回 类 型, 没 有 返 回 值 可 重 载 在 创 建 对 象 ( 变 量 ) 时, 由 系 统 自 行 调 用 用 户 无 法 调 用!
通 过 构 造 方 法, 完 成 对 新 建 对 象 的 域 成 员 的 定 制 初 始 化 构 造 方 法 的 形 式 [ 访 问 控 制 级 别 ] 类 名 ( [ 形 参 列 表 ] ) public class Speed public Speed( int x_sp, int y_sp ) this.x_speed=x_sp ; this.y_speed=y_sp;
在 创 建 对 象 ( 变 量 ) 时, 由 系 统 自 行 调 用 构 造 方 法 public class Point public Point( int x, int y ) x_val = x ; y_val = y ; public Point( int x ) x_val = x ; y_val = 0 ; private int x_val ; // 点 的 x 坐 标 private int y_val ; // 点 的 y 坐 标 public class Test public static void main(string[] args) Point p1 = new Point( 1, 1 ); Point p2 = new Point( 10 ); 1. 使 用 new, 创 建 一 个 Point 对 象 实 例 2. 根 据 实 参 列 表, 系 统 自 行 调 用 相 应 的 构 造 方 法 3. 通 过 构 造 方 法, 对 相 应 的 域 成 员 初 始 化 4. 让 同 类 型 的 对 象 引 用 ( 指 向 ) 新 建 的 实 例
通 过 构 造 方 法, 对 类 的 常 量 域 成 员 进 行 初 始 化 在 构 造 方 法 中, 可 对 未 初 始 化 的 常 量 域 成 员 赋 值 如 果 已 经 在 常 量 域 成 员 的 声 明 语 句 中 完 成 了 初 始 化, 那 么 将 不 能 再 在 构 造 方 法 中 对 其 初 始 化 反 之 亦 然 在 声 明 语 句 或 构 造 方 法 中, 都 未 对 常 量 域 成 员 进 行 初 始 化 这 将 导 致 语 法 错 误
通 过 构 造 方 法, 对 类 中 未 初 始 化 的 常 量 域 成 员 赋 值 public class SaveBox private final int capacity ; private int amount = 0 ; public SaveBox( int capacity_val ) capacity = capacity_val ;
在 构 造 方 法 中, 调 用 其 他 构 造 方 法 完 成 域 成 员 的 初 始 化 public class Point public Point( int x, int y ) x_val = x ; y_val = y ; public Point( int x ) x_val = x ; y_val = 0 ; private int x_val ; // 点 的 x 坐 标 private int y_val ; // 点 的 y 坐 标 public class Point public Point( int x, int y ) x_val = x ; y_val = y ; public Point( int x ) Point( x, 0 ) ; 语 法 错 误 构 造 方 法 只 能 被 系 统 调 用
在 构 造 方 法 中, 调 用 其 他 构 造 方 法 完 成 域 成 员 的 初 始 化 public class Point public Point( int x, int y ) x_val = x ; y_val = y ; public Point( int x ) Point( x, 0 ) ; public class Point public Point( int x, int y ) x_val = x ; y_val = y ; public Point( int x ) this( x, 0 ) ; 修 改 调 用 this() 方 法, 访 问 其 他 构 造 方 法
使 用 this() 方 法 的 几 点 注 意 调 用 方 式 this([ 实 参 列 表 ]) ; this() 语 句 必 须 是 所 在 构 造 方 法 的 第 一 条 语 句 this() 语 句 只 能 出 现 在 构 造 方 法 中 在 非 构 造 方 法 的 方 法 中, 不 能 通 过 this() 语 句 直 接 调 用 构 造 方 法
在 创 建 对 象 ( 变 量 ) 时, 由 系 统 自 行 调 用 构 造 方 法 public class Point private int x_val ; // 点 的 x 坐 标 private int y_val ; // 点 的 y 坐 标 public Point( ) 默 认 构 造 方 法 public class Test public static void main(string[] args) Point p3 = new Point( ) ; 1. 如 果 未 在 类 中 定 义 构 造 方 法, 那 么 系 统 将 自 行 创 建 一 个 默 认 的 构 造 方 法, 以 供 使 用
Java 类 的 默 认 构 造 方 法 默 认 构 造 方 法 如 果 在 类 中 没 有 定 义 任 何 构 造 方 法, 那 么 编 译 器 会 自 动 创 建 一 个 无 参 函 数 体 为 空 的 构 造 方 法 如 果 声 明 了 任 何 一 个 构 造 方 法, 那 么 编 译 器 就 不 会 再 自 动 创 建 该 类 的 默 认 构 造 方 法
在 创 建 对 象 ( 变 量 ) 时, 由 系 统 自 行 调 用 构 造 方 法 public class Point private int x_val ; // 点 的 x 坐 标 private int y_val ; // 点 的 y 坐 标 public class Test public static void main(string[] args) public Point(int x) x_val=x; Point p4 = new Point( ) ; 语 法 错 误 class Point 未 提 供 无 参 的 构 造 方 法 系 统 也 无 法 提 供 默 认 的 构 造 方 法
在 创 建 对 象 ( 变 量 ) 时, 由 系 统 自 行 调 用 构 造 方 法 public class Point private int x_val ; // 点 的 x 坐 标 private int y_val ; // 点 的 y 坐 标 public void Point( ) x_val= -1; y_val= -1 原 因 public class Test public static void main(string[] args) Point p5 = new Point( ) ; p5.x_val 和 p5.y_val 分 别 是 多 少? class Point 未 提 供 任 何 构 造 方 法 因 此, 系 统 自 动 产 生 该 类 的 默 认 构 造 方 法
能 被 同 类 别 对 象 共 享 的 信 息 与 工 具 静 态 成 员 被 关 键 字 static 修 饰 的 域 成 员 和 成 员 方 法 没 有 this 引 用 静 态 成 员 属 于 整 个 类, 为 该 类 的 全 体 对 象 所 共 享 提 供 了 共 享 数 据 和 方 法 的 途 径
静 态 域 成 员 的 声 明 与 使 用 声 明 [ 访 问 级 别 ] static 数 据 类 型 变 量 [= 初 始 值 ] ; 使 用 类 名. 静 态 域 成 员
静 态 成 员 方 法 的 定 义 与 使 用 定 义 [ 访 问 级 别 ] static 返 回 类 型 方 法 ([ 形 参 列 表 ]) 使 用 类 名. 静 态 成 员 方 法 ([ 实 参 列 表 ])
使 用 静 态 成 员 的 几 点 注 意 如 果 没 有 初 始 化 静 态 变 量, 那 么 编 译 器 将 自 动 对 其 赋 相 应 的 默 认 值 在 静 态 方 法 中, 不 允 许 使 用 非 静 态 成 员 如 果 直 接 在 main 方 法 中 调 用 其 他 方 法, 那 么 该 方 法 必 须 是 静 态 方 法
在 类 体 中, 使 用 static 修 饰 的 语 句 块 public class Goods static System.out.println("static block"); public Goods( ) System.out.println("Goods"); 静 态 区 块 在 创 建 类 的 对 象 时, 系 统 会 先 执 行 静 态 区 块 中 的 代 码, 且 只 会 执 行 一 次 ( 无 论 创 建 多 少 对 象 )
从 J2SE 5.0 后 才 支 持 的 静 态 导 入 形 式 import static 静 态 成 员 的 全 名 ; 导 入 类 或 接 口 中 的 静 态 成 员 import static java.lang.system.out; public class One public static void main(string[] args) System.out.println("text"); out.println("static import");
Java 的 垃 圾 回 收 机 制 java 运 行 环 境 会 自 动 检 查 对 象 如 果 有 未 被 引 用 的 对 象, 那 么 就 清 除 它 们, 回 收 这 些 对 象 所 占 用 的 内 存 空 间 并 返 回 给 系 统 系 统 不 能 保 证 垃 圾 收 集 程 序 一 定 能 够 ( 及 时 ) 执 行!
( 强 制 建 议 ) 启 动 垃 圾 收 集 1. 对 象 =null; 2. 调 用 System.gc(), 建 议 启 动 垃 圾 回 收 程 序 3. 如 果 垃 圾 回 收 程 启 动 成 功, 那 么 目 标 对 象 就 会 被 回 收 在 收 回 目 标 对 象 前, 它 的 finalize() 方 法 会 被 系 统 自 动 调 用 finalize() 方 法 不 能 重 载, 只 能 被 覆 盖
J2SE 5.0 后 才 支 持 的 可 变 长 度 参 数 形 式 数 据 类 型 形 式 参 数 public double mean( int a, double nums ) 可 变 长 度 参 数 在 调 用 方 法 前, 无 法 确 定 同 类 型 参 数 的 个 数 本 质 上, 可 变 长 度 的 参 数 就 是 一 个 同 类 型 的 参 数 数 组 可 变 长 度 的 参 数 必 须 是 形 式 参 数 列 表 中 的 最 后 一 个 参 数 在 一 个 形 参 列 表 中, 不 能 出 现 两 个 以 上 的 可 变 长 度 参 数
成 员 方 法 重 载 方 法 形 参 列 表 是 区 分 方 法 重 载 的 标 志 递 归 方 法 必 须 存 在 结 束 递 归 的 条 件
一 切 皆 对 象! [package 语 句 ] [import 语 句 ] [public] class [ 构 造 方 法 ] [ 域 成 员 ] [ 成 员 方 法 ] Java 源 代 码 的 一 般 形 式
面 向 对 象 程 序 设 计 语 言 解 决 问 题 的 一 般 步 骤 使 用 Java 类, 编 写 程 序 声 明 数 据 类 型 为 目 标 类 的 变 量 ( 对 象 ) 通 过 点 运 算 符, 调 用 该 对 象 的 公 共 成 员 ( 公 共 域 成 员 和 公 共 方 法 ); 利 用 对 象 间 的 消 息 传 递, 编 写 程 序, 解 决 问 题
说 明 类 名 必 须 是 合 法 的 Java 标 识 符 如 果 类 不 是 public 类, 那 么 该 类 只 能 被 同 一 包 中 的 其 他 类 使 用 源 文 件 必 须 与 文 件 中 的 public 类 同 名 可 以 在 一 个 源 文 件 中 定 义 多 个 类, 但 只 能 有 一 个 公 共 类
说 明 尽 量 使 用 java API( 类 库 ) 完 成 工 作 一 个 方 法 完 成 一 个 功 能 调 用 方 法 的 实 参 列 表 必 须 与 方 法 声 明 中 的 形 参 列 表 一 致 实 参 与 形 参 结 合 的 方 式 是 值 传 递
说 明 实 际 参 数 与 相 应 的 形 式 参 数 的 数 据 类 型 应 该 兼 容 在 不 损 失 精 度 的 前 提 下, 参 数 的 类 型 会 发 生 自 动 转 换 ( 参 数 提 升 ) 否 则, 应 强 制 类 型 转 换 boolean 值 不 能 被 参 数 提 升
说 明 公 共 属 性 被 public 修 饰 的 属 性 调 用 方 式 在 类 的 内 部, 通 过 公 共 属 性 名 直 接 访 问 在 类 的 外 部, 通 过 对 象. 公 共 属 性 名 进 行 访 问
说 明 公 共 方 法 被 public 修 饰 的 成 员 方 法 调 用 方 式 在 类 的 内 部, 可 以 被 直 接 调 用 公 共 方 法 ([ 实 际 参 数 列 表 ]) 在 类 的 外 部, 可 以 通 过 如 下 方 式 调 用 对 象. 公 共 方 法 ([ 实 际 参 数 列 表 ])
说 明 私 有 属 性 被 private 修 饰 的 属 性 调 用 方 式 在 类 的 内 部, 可 以 通 过 私 有 属 性 名 直 接 调 用 在 类 的 外 部, 无 法 访 问
说 明 私 有 方 法 被 private 修 饰 的 成 员 方 法 调 用 方 式 在 类 的 内 部, 可 以 被 直 接 调 用 私 有 方 法 ([ 实 际 参 数 列 表 ]) 在 类 的 外 部, 不 可 以 访 问
说 明 参 数 声 明 的 作 用 域 是 声 明 所 在 的 方 法 体 内 局 部 变 量 的 作 用 域 是 从 块 中 声 明 的 地 方 到 块 的 尾 部 在 带 标 号 的 break 语 句 和 continue 语 句 中, 标 号 的 作 用 域 是 带 标 号 结 构 包 围 的 语 句 在 for 结 构 头 部 内 声 明 的 局 部 变 量, 其 作 用 域 是 for 循 环 体 和 结 构 头 部 中 的 其 他 表 达 式 类 中 的 成 员 方 法 和 域 成 员 的 作 用 域 是 整 个 类 在 嵌 套 结 构 中, 外 层 声 明 的 变 量 不 应 与 内 层 声 明 的 变 量 同 名
待 续