尚硅谷佟刚Java基础高级类特性.pptx

上传人:max****ui 文档编号:20791357 上传时间:2021-04-18 格式:PPTX 页数:44 大小:1.04MB
返回 下载 相关 举报
尚硅谷佟刚Java基础高级类特性.pptx_第1页
第1页 / 共44页
尚硅谷佟刚Java基础高级类特性.pptx_第2页
第2页 / 共44页
尚硅谷佟刚Java基础高级类特性.pptx_第3页
第3页 / 共44页
点击查看更多>>
资源描述
static 关 键 字 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 接 口 ( interface 关 键 字 ) 内 部 类 static 关 键 字 静 态 属 性 静 态 初 始 化 静 态 方 法 单 子 模 式 理 解 main方 法 的 语 法 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 接 口 ( interface 关 键 字 ) 内 部 类 当 我 们 编 写 一 个 类 时 , 其 实 就 是 在 描 述 其 对 象 的 属 性 和 行为 , 而 并 没 有 产 生 实 质 上 的 对 象 , 只 有 通 过 new关 键 字 才 会产 生 出 对 象 , 这 时 系 统 才 会 分 配 内 存 空 间 给 对 象 , 其 方 法 才可 以 供 外 部 调 用 。 我 们 有 时 候 希 望 无 论 是 否 产 生 了 对 象 或 无论 产 生 了 多 少 对 象 的 情 况 下 , 某 些 特 定 的 数 据 在 内 存 空 间 里只 有 一 份 , 例 如 所 有 的 中 国 人 都 有 个 国 家 名 称 , 每 一 个 中 国人 都 共 享 这 个 国 家 名 称 , 不 必 在 每 一 个 中 国 人 的 实 例 对 象 中都 单 独 分 配 一 个 用 于 代 表 国 家 名 称 的 变 量 。 class Circle private double radius;public Circle(double radius)this.radius=radius;public double findArea()return Math.PI*radius*radius; 创 建 两 个 Circle对 象 Circle c1=new Circle(2.0); /c1.radius=2.0 Circle c2=new Circle(3.0); /c2.radius=3.0 Circle类 中 的 变 量 radius是 一 个 实 例 变 量 (instance variable), 它 属 于 类 的 每 一 个 对 象 , 不 能 被 同 一 个 类 的不 同 对 象 所 共 享 。 上 例 中 c1的 radius独 立 于 c2的 radius, 存 储 在 不 同 的 空间 。 c1中 的 radius变 化 不 会 影 响 c2的 radius, 反 之 亦 然 。 如 果 想 让 一 个 类 的 所 有 实 例 共 享 数 据 , 请 用 类 变 量 在 Java类 中 声 明 变 量 、 方 法 和 内 部 类 时 , 可 使 用 关键 字 static做 为 修 饰 符 。 static标 记 的 变 量 或 方 法 由 整 个 类 (所 有 实 例 )共 享 ,如 访 问 控 制 权 限 允 许 , 可 不 必 创 建 该 类 对 象 而 直 接用 类 名 加 .调 用 。 static成 员 也 称 类 成 员 或 静 态 成 员 , 如 : 类 变 量 、类 方 法 、 静 态 方 法 等 。 类 变 量 ( 类 属 性 ) 由 该 类 的 所 有 实 例 共 享public class Person private int id; public static int total = 0; public Person() total+; id = total; Person+total : int = 0 -id : intp1 : Personid=1 p2 : Personid=2 Person p1=new Person(); Person p2=new Person(); 类 属 性 类 似 于 全 局 变 量 class Person private int id; public static int total = 0; public Person() total+; id = total; public static void main(String args) Person Tom=new Person()Tom.id=0;total=100; / 不 用 创 建 对 象 就 可 以 访 问 静 态 成 员 public class OtherClass public static void main(String args) Person.total = 100; / 不 用 创 建 对 象 就 可 以 访 问 静 态 成 员 /访 问 方 式 : 类 名 .类 属 性 类 名 .类 方 法 System.out.println(Person.total); Person c = new Person(); System.out.println(c.total); /输 出 101 class Person private int id; private static int total = 0 ; public static int getTotalPerson() return total; public Person() total+; id = total; public class TestPerson public static void main(String args) System.out.println(Number of total is +Person.getTotalPerson();/没有创建对象也可以访问静态方法 Person p1 = new Person(); System.out.println( Number of total is + Person.getTotalPerson(); 没 有 对 象 的 实 例 时 , 可 以 用 类 名 .方 法 名 ()的 形 式 访 问 由 static标 记 的 类 方 法 。The output is:Number of total is 0Number of total is 1 在 static方 法 内 部 只 能 访 问 类 的 static属 性 , 不 能 访 问 类 的 非 static属 性 。class Person private int id; private static int total = 0 ; public static int getTotalPerson() id+; /非法return total; public Person() total+; id = total; 因 为 不 需 要 实 例 就 可 以 访 问 static方 法 , 因 此 static方 法 内 部 不 能 有 this,(也 不 能 有super ? )class Person private int id; private static int total = 0; public static void setTotalPerson(int total) this.total=total; /非 法 , 在 static方 法 中 不 能 有 this, 也 不 能 有 super public Person() total+; id = total; public class TestPerson public static void main(String args) Person.setTotalPerson(); 在 静 态 方 法 里 只 能 直 接 调 用 同 类 中 其 它 的 静 态 成 员 ( 包 括 变 量 和方 法 ) , 而 不 能 直 接 访 问 类 中 的 非 静 态 成 员 。 这 是 因 为 , 对 于 非静 态 的 方 法 和 变 量 , 需 要 先 创 建 类 的 实 例 对 象 后 才 可 使 用 , 而 静态 方 法 在 使 用 前 不 用 创 建 任 何 对 象 。 静 态 方 法 不 能 以 任 何 方 式 引 用 this和 super关 键 字 。 与 上 面 的 道 理一 样 , 因 为 静 态 方 法 在 使 用 前 不 用 创 建 任 何 实 例 对 象 , 当 静 态 方法 被 调 用 时 , this所 引 用 的 对 象 根 本 就 没 有 产 生 。 main() 方 法 是 静 态 的 , 因 此 JVM在 执 行 main方 法 时 不 创 建 main方 法 所 在 的 类 的 实 例 对 象 , 因 而 在 main()方 法 中 , 我 们 不 能 直 接访 问 该 类 中 的 非 静 态 成 员 , 必 须 创 建 该 类 的 一 个 实 例 对 象 后 , 才能 通 过 这 个 对 象 去 访 问 类 中 的 非 静 态 成 员 , 这 种 情 况 , 我 们 在 以后 的 例 子 中 会 多 次 碰 到 。 类 属 性 作 为 该 类 各 个 对 象 之 间 共 享 的 变 量 。 在 设 计 类 时 ,分 析 哪 些 类 属性 不 因 对 象 的 不 同 而 改 变 , 将 这 些 属 性 设 置 为 类 属 性 。 相 应 的 方 法 设 置 为类 方 法 。 如 果 方 法 与 调 用 者 无 关 , 则 这 样 的 方 法 通 常 被 声 明 为 类 方 法 , 由 于 不 需要 创 建 对 象 就 可 以 调 用 类 方 法 , 从 而 简 化 了 方 法 的 调 用练 习 1: 编 写 一 个 类 , 实 现 银 行 账 户 的 概 念 , 包 含 的 属 性 有 “帐 号 ”、 “密 码 ”、“存 款 余 额 ”、 “利 率 ”、 “最 小 余 额 ”, 定 义 封 装 这 些属 性 的 方 法 。 账 号 要 自 动 生 成 。编 写 主 类 , 使 用 银 行 账 户 类 , 输 入 、 输 出 3个 储 户 的 上 述 信 息 。考 虑 : 哪 些 属 性 可 以 设 计 成 static属 性 。 Bank.java static块 通 常 用 于 初 始 化 static (类 )属 性class Person public static int total;static total = 100;/为 total赋 初 值 /其 它 属 性 或 方 法 声 明 class Person public static int total; static total = 100;System.out.println(in static block!); public class Test public static void main(String args) System.out.println(total = + Person.total);System.out.println(total = + Person.total);输出:in static blocktotal=1 0 0total=1 0 0 设 计 模 式 是 在 大 量 的 实 践 中 总 结 和 理 论 化 之 后 优 选 的 代 码 结 构 、 编 程 风 格 、以 及 解 决 问 题 的 思 考 方 式 。 设 计 模 式 就 想 是 经 典 的 棋 谱 , 不 同 的 棋 局 , 我们 用 不 同 的 棋 谱 , 免 得 我 们 自 己 再 去 思 考 和 摸 索 。所 谓 类 的 单 态 设 计 模 式 , 就 是 采 取 一 定 的 方 法 保 证 在 整 个 的 软 件 系 统 中 ,对 某 个 类 只 能 存 在 一 个 对 象 实 例 , 并 且 该 类 只 提 供 一 个 取 得 其 对 象 实 例 的方 法 。 如 果 我 们 要 让 类 在 一 个 虚 拟 机 中 只 能 产 生 一 个 对 象 , 我 们 首 先 必 须将 类 的 构 造 方 法 的 访 问 权 限 设 置 为 private, 这 样 , 就 不 能 用 new 操 作 符 在类 的 外 部 产 生 类 的 对 象 了 , 但 在 类 内 部 仍 可 以 产 生 该 类 的 对 象 。 因 为 在 类的 外 部 开 始 还 无 法 得 到 类 的 对 象 , 只 能 调 用 该 类 的 某 个 静 态 方 法 以 返 回 类内 部 创 建 的 对 象 , 静 态 方 法 只 能 访 问 类 中 的 静 态 成 员 变 量 , 所 以 , 指 向 类内 部 产 生 的 该 类 对 象 的 变 量 也 必 须 定 义 成 静 态 的 。 class Single private static Single onlyone = new Single();/私 有 的 , 只 能 在 类 的 内 部 访 问 private String name;public static Single getSingle() /getSingle()为 static, 不 用 创 建 对 象 /即 可 访 问 return onlyone; private Single() /private的 构 造 器 , 不 能 在 类 的 外 部 创 建 该 类 的 对 象 public class TestSinglepublic static void main(String args) Single s1 = Single.getSingle(); /访 问 静 态 方 法Single s2 = Single.getSingle();if (s1=s2) System.out.println(s1 is equals to s2!); 理 解 main方 法 的 语 法 由 于 java虚 拟 机 需 要 调 用 类 的 main()方 法 , 所 以 该 方 法 的访 问 权 限 必 须 是 public, 又 因 为 java虚 拟 机 在 执 行 main()方法 时 不 必 创 建 对 象 , 所 以 该 方 法 必 须 是 static的 , 该 方 法 接收 一 个 String类 型 的 数 组 参 数 , 该 数 组 中 保 存 执 行 java命 令时 传 递 给 所 运 行 的 类 的 参 数 。 public class CommandPara public static void main(String args) for ( int i = 0 ; i args.length; i+ ) System.out.println(args + i + = + argsi); /运 行 程 序 CommandPara.javajava CommandPara lisa bily Mr Brown/输 出 结 果 :args0 = lisaargs1 = bilyargs2 = Mr Brown static 关 键 字 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 接 口 ( interface 关 键 字 ) 内 部 类 在 Java中 声 明 类 、 属 性 和 方 法 时 , 可 使 用 关 键 字 final来 修 饰 。 final标 记 的 变 量 (成 员 变 量 或 局 部 变 量 )即 成 为 常 量 , 只 能 赋值 一 次 。 final标 记 的 类 不 能 被 继 承 。 提 高 安 全 性 , 提 高 程 序 的 可 读 性 。 final标 记 的 方 法 不 能 被 子 类 重 写 。 增 加 安 全 性 。 final标 记 的 成 员 变 量 必 须 在 声 明 的 同 时 或 在 每 个 构 造 方 法 中显 式 赋 值 , 然 后 才 能 使 用 。 final PI=3.14; public final class Testpublic static int totalNumber= 5 ;public final int id;public Test()id = +totalNumber;/只 能 在 构 造 方 法 中 给 final变 量 赋 值 public static void main(String args) Test t = new Test();System.out.println(t.id);final int i = 10;final int j;j = 20;j = 30; /非 法 static 关 键 字 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 抽 象 类 抽 象 方 法 接 口 ( interface 关 键 字 ) 内 部 类 随 着 继 承 层 次 中 一 个 个 新 子 类 的 定 义 , 类 变 得 越 来 越 具 体 , 而 父 类 则 更一 般 , 更 通 用 。 类 的 设 计 应 该 保 证 父 类 和 子 类 能 够 共 享 特 征 。 有 时 将 一个 父 类 设 计 得 非 常 抽 象 , 以 至 于 它 没 有 具 体 的 实 例 , 这 样 的 类 叫 做 抽 象类 。 用 abstract关 键 字 来 修 饰 一 个 类 时 , 这 个 类 叫 做 抽 象 类 ; 用 abstract来 修饰 一 个 方 法 时 , 该 方 法 叫 做 抽 象 方 法 。 抽 象 方 法 : 只 有 方 法 的 声 明 , 没 有 方 法 的 实 现 。 以 分 号 结 束 。 abstract int abstractMethod1( int a ); 含 有 抽 象 方 法 的 类 必 须 被 声 明 为 抽 象 类 。 抽 象 类 不 能 被 实 例 化 。 抽 象 类 是 用 来 被 继 承 的 , 抽 象 类 的 子 类 必 须 重 写父 类 的 抽 象 方 法 , 并 提 供 方 法 体 。 不 能 用 abstract修 饰 私 有 方 法 , 构 造 方 法 , 静 态 方 法 。 abstract class A abstract void m1( ); public void m2( )System.out.println(A类 中 定 义 的 m2方 法 ); class B extends A void m1( )System.out.println(B类 中 定 义 的 m1方 法 ); public class Test public static void main( String args )A c = new B( );c.m1( );c.m2( ); 在 航 运 公 司 系 统 中 , Vehicle类 需 要 定 义 两 个 方 法 分 别 计 算 运 输 工 具 的 燃 料 效 率 和行 驶 距 离 。抽 象 类 是 用 来 模 型 化 那 些 父 类 无 法 确 定 全 部 实 现 , 而 是 由 其 子 类 提 供 具 体 实 现 的对 象 的 类 。问 题 : 卡 车 (Truck)和 驳 船 (RiverBarge)的 燃 料 效 率 和 行 驶 距 离 的 计 算 方 法 完 全 不 同 。Vehicle类 不 能 提 供 计 算 方 法 , 但 子 类 可 以 。 解 决 方 案Java允 许 类 设 计 者 指 定 : 超 类 声 明 一 个 方 法 但 不 提 供 实 现 , 该 方 法 的 实 现 由 子类 提 供 。 这 样 的 方 法 称 为 抽 象 方 法 。 有 一 个 或 更 多 抽 象 方 法 的 类 称 为 抽 象 类 。 Vehicle是 一 个 抽 象 类 , 有 两 个 抽 象 方 法 。public abstract class Vehiclepublic abstract double calcFuelEfficiency(); /计 算 燃 料 效 率 的 抽 象 方 法public abstract double calcTripDistance();/计 算 行 驶 距 离 的 抽 象 方 法public class Truck extends Vehiclepublic double calcFuelEfficiency( ) /写 出 计 算 卡 车 的 燃 料 效 率 的 具 体 方 法 public double calcTripDistance( ) /写 出 计 算 卡 车 行 驶 距 离 的 具 体 方 法 public class RiverBarge extends Vehicle public double calcFuelEfficiency( ) /写 出 计 算 驳 船 的 燃 料 效 率 的 具 体 方 法 public double calcTripDistance( ) /写 出 计 算 驳 船 行 驶 距 离 的 具 体 方 法 注 意 : 抽 象 类 不 能 实 例 化 new Vihicle()是 非 法 的 static 关 键 字 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 接 口 ( interface 关 键 字 ) 内 部 类 Oracle MySQL SQLServer DB2Java APP Oracle MySQL SQLServer DB2Java APPJDBC 有 时 必 须 从 几 个 类 中 派 生 出 一 个 子 类 , 继 承 它 们 所 有 的 属 性 和 方 法 。但 是 , Java不 支 持 多 重 继 承 。 有 了 接 口 , 就 可 以 得 到 多 重 继 承 的 效 果 。 接 口 (interface)是 抽 象 方 法 和 常 量 值 的 定 义 的 集 合 。 从 本 质 上 讲 , 接 口 是 一 种 特 殊 的 抽 象 类 , 这 种 抽 象 类 中 只 包 含 常 量 和方 法 的 定 义 , 而 没 有 变 量 和 方 法 的 实 现 。 接 口 定 义 举 例public interface Runner int id = 1;public void start();public void run();public void stop(); 接 口 的 特 点 : 用 interface 来 定 义 。 接 口 中 的 所 有 成 员 变 量 都 默 认 是 由 public static final修 饰 的 。 接 口 中 的 所 有 方 法 都 默 认 是 由 public abstract修 饰 的 。 接 口 没 有 构 造方 法 。 实 现 接 口 的 类 中 必 须 提 供 接 口 中 所 有 方 法 的 具 体 实 现 内 容 。 多 个 无 关 的 类 可 以 实 现 同 一 个 接 口 一 个 类 可 以 实 现 多 个 无 关 的 接 口 与 继 承 关 系 类 似 , 接 口 与 实 现 类 之 间 存 在 多 态 性 接 口 也 可 以 继 承 另 一 个 接 口 , 使 用 extends关 键 字 。 实 现 接 口 的 类 中 必 须 提 供 接 口 中 所 有 方 法 的 具 体 实 现 内 容 。 多 个 无 关 的 类 可 以 实 现 同 一 个 接 口 一 个 类 可 以 实 现 多 个 无 关 的 接 口 与 继 承 关 系 类 似 , 接 口 与 实 现 类 之 间 存 在 多 态 性 定 义 Java类 的 语 法 格 式 : class extends implements ,* * public interface Runner public void start();public void run();public void stop();public class Person implements Runner public void start() / 准 备 工 作 : 弯 腰 、 蹬 腿 、 咬 牙 、 瞪 眼/ 开 跑public void run() / 摆 动 手 臂/ 维 持 直 线 方 向public void stop() / 减 速 直 至 停 止 、 喝 水 。 Runner+start()+run()+stop()Person+start()+run()+stop()+dance() Car+start()+run()+stop()+fillFuel()+crack() Bird+start()+run()+stop()+fly() 一 个 类 可 以 实 现 多 个 无 关 的 接 口interface Runner public void run();interface Swimmer public double swim();class Animal public int eat() class Person extends Animal implements Runner,Swimmerpublic void run() public double swim() public int eat() 与 继 承 关 系 类 似 , 接 口 与 实 现 类 之 间 存 在 多 态 性public class Testpublic static void main(String args)Test t = new Test();Person p = new Person();t.m1(p);t.m2(p); t.m3(p);public String m1(Runner f) f.run(); public void m2(Swimmer s) s.swim();public void m3(Animal a) a.eat(); 如 果 实 现 接 口 的 类 中 没 有 实 现 接 口 中 的 全 部 方 法 , 必 须 将 此 类 定 义 为 抽 象 类 。 接 口 也 可 以 继 承 另 一 个 接 口 , 使 用 extends关 键 字 。 interface MyInterface String s=“MyInterface”;public void absM1();interface SubInterface extends MyInterface public void absM2();public class SubAdapter implements SubInterface public void absM1()System.out.println(“absM1”); public void absM2()System.out.println(“absM2”); 实 现 类 SubAdapter必 须 给 出 接 口 SubInterface以 及 父 接 口 MyInterface中 所 有 方 法 的 实 现 。 定 义 一 个 接 口 用 来 实 现 两 个 对 象 的 比 较 。 interface CompareObject public int compareTo(Object o); /若 返 回 值 是 0 , 代 表 相 等 ; 若 为 正 数 , 代 表 当 前 对 象 大 ; 负 数 代 表 当 前 对 象 小 定 义 一 个 Circle类 。 定 义 一 个 ComparableCircle类 , 继 承 Circle类 并 且 实 现 CompareObject接 口 。 在ComparableCircle类 中 给 出 接 口 中 方 法 compareTo的 实 现 体 , 用 来 比 较 两 个 圆 的半 径 大 小 。 定 义 一 个 测 试 类 TestInterface, 创 建 两 个 ComaparableCircle对 象 , 调 用compareTo方 法 比 较 两 个 类 的 半 径 大 小 。 思 考 : 参 照 上 述 做 法 定 义 矩 形 类 Rectangle和 ComparableRectangle类 , 在ComparableRectangle类 中 给 出 compareTo方 法 的 实 现 , 比 较 两 个 矩 形 的 面 积 大 小 。 static 关 键 字 final 关 键 字 抽 象 类 ( abstract 关 键 字 ) 接 口 ( interface 关 键 字 ) 内 部 类 在 Java中 , 允 许 一 个 类 的 定 义 位 于 另 一 个 类 的 内 部 , 前 者 称 为 内 部 类 内 部 类 和 外 层 封 装 它 的 类 之 间 存 在 逻 辑 上 的 所 属 关 系 Inner class一 般 用 在 定 义 它 的 类 或 语 句 块 之 内 , 在 外 部 引 用 它 时 必 须 给出 完 整 的 名 称 。 Inner class的 名 字 不 能 与 包 含 它 的 类 名 相 同 ; Inner class可 以 使 用 包 含 它 的 类 的 静 态 和 实 例 成 员 变 量 , 也 可 以 使 用 它所 在 方 法 的 局 部 变 量 ; class A private int s;public class B public void mb() s = 1 0 0 ; System.out.println(在内部类B中s= + s); public void ma() B i = new B();i.mb(); public class Test public static void main(String args) A o = new A(); o.ma(); public class A private int s = 111; public class B private int s = 222;public void mb(int s) System.out.println(s); / 局 部 变 量 s System.out.println(this.s); / 内 部 类 对 象 的 属 性 s System.out.println(A.this.s); / 外 层 类 对 象 属 性 s public static void main(String args)A a = new A();A.B b = a.new B();b.mb(333); Inner class可 以 声 明 为 抽 象 类 , 因 此 可 以 被 其 它 的 内 部 类 继 承 。 也 可以 声 明 为 final的 。 和 外 层 类 不 同 , Inner class可 以 声 明 为 private或 protected; Inner class 可 以 声 明 为 static的 , 但 此 时 就 不 能 再 使 用 外 层 封 装 类 的 非static的 成 员 变 量 ; 非 static的 内 部 类 中 的 成 员 不 能 声 明 为 static的 , 只 有 在 顶 层 类 或 static的 内 部 类 中 才 可 声 明 static成 员 ;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!