




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程名称:对象的多态性 2、知识点 2.1、上次 课程的主要知识点 1、在自己的开发中 final 定义类、定义方法都很少出现; 2、使用 public final static 定义的是全局常量; 2.2、本次 预计讲解的知识点 本次只是为了多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有太大关 系,而且多态一定是在继承性的基础上才可以操作的,而本次将使用类继承的关系来描述 多态的性质,实际的开发中不会出现普通类的继承关系(一个完善的类不应该再被进行继承) ,在开发中都要求继承抽象类和接口。 3、具体内容( ) 多态性要想实现有两个前提:继承、覆写。 范例:引出代码 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); public class TestDemo public static void main(String args) B b = new B(); b.print(); 覆写调用前提:看 new 的是哪个 类的对象,而后方法是否被指类所覆写。 在 java 中多态性由两个方面组成: 方法的多态性: |-方法重载:方法调用时根据不同的参数个数及类型可以实现不同的功能; |-方法覆写:不同的子类针对同样一个方法可以有不同的实现。 对象的多态性:父类与子类间的转换操作; |-对象的向上转型: 父类 父类对象 = 子类实例,自动完成的; |-对象的向下转型:子类 子类对象 = (子类) 父类实例,强制转换。 范例:对象的向上转型 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); public class TestDemo public static void main(String args) A a = new B();/向上转型 a.print(); 可以发现向上转型是自动完成的,而除了向上 转型之外,也可以实现对象的向下转型操作。 范例:对象的向下转型 public class TestDemo public static void main(String args) A a = new B();/向上转型 B b = (B)a; /向下转型 b.print(); 具体的转型概念没什么难理解的,那么程序的 执行结果也很好理解,但是这样做有什么意义呢? 分析:向上转型的意义 现在要求定义一个 fun()方法, 这个方法要求, 这个方法要求可以接收 A 以及 A 类所有子类的实例化 对象;于是根据这样的描述可以有两种实现方案: 方案一:使用方案重载的概念来完成。 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); class C extends A public void print() System.out.println(“不好“); public class TestDemo public static void main(String args) fun(new A(); fun(new B(); fun(new C(); public static void fun(A a) a.print(); public static void fun(B b) b.print(); public static void fun(C c) c.print(); 但是,如果说这个时候 A 类有 3000W 个子类,并且 这个子类还在以倍数的方式进行增长,那么就表 示:在设计之初此方法就要重载 3000W 次,并且随着子类的不段增加,此方法继续重载,继续不断的 修改类,于是你疯了,世界疯了,就没有人用了。 方案二:发现所有子类调用的方法实际上都只是 print()一个,那么现在可以利用对象自动向 上转型的概念,就直接使用 A 类接收。 public class TestDemo public static void main(String args) fun(new A(); fun(new B(); fun(new C(); public static void fun(A a) a.print(); 所以对象的向上转型给开发者最大的帮助在于其数据操作的统一上。 分析:向下转型的意义 范例:观察问题 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); public void funB()/子类自己扩充的新方法 System.out.println(“*B*“); public class TestDemo public static void main(String args) A a = new B();/向上转型 a.print(); a.funB(); /不能够调用 一旦发生了向上转型之后,父类对 象是不可能调用子类中新建的方法,只能够调用自己本身所定义 的方法名称,也就是说向上转型之后 牺牲的是子类的个性化特征。但是如果说现在要想调用子类定 义的特殊方法,那么必须采用向下 转型。 public class TestDemo public static void main(String args) A a = new B();/向上转型 a.print(); B b =(B)a;/向下转型才可以调用子类的新支持方法 b.funB(); /不能够调用 解释:为什么现在你的代码里面需要先向上转型,再进行向下转型, 啰嗦。 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); public void funB()/子类自己扩充的新方法 System.out.println(“*B*“); class C extends A public void print() System.out.println(“不好“); public void funC()/子 类自己扩充的新方法 System.out.println(“*C*“); public class TestDemo public static void main(String args) fun(new B(); fun(new C(); public static void fun(A a) a.print(); /由于某种特殊需求必须调用 B 类中的 funB()方法,所以进行向下转型 B b =(B)a; b.funB(); 现在如果使用了向下转型,那么在之前好不容易建立起来的参数统一的局面就被打破了,所以 这样 的操作就属于不合理的操作形式.但是转型的意义更加明确了:为了调用子类自己的特殊支持。 但是在进行对象的向下转型前也需要一个注意点: 范例:错误的向下转型操作 class A public void print() System.out.println(“Hello“); class B extends A public void print() System.out.println(“你好“); public void funB()/子类自己扩充的新方法 System.out.println(“*B*“); public class TestDemo public static void main(String args) A a = new A();/父类对象 B b = (B)a;/向下强制转换 b.print(); 此时“java.lang.ClassCastException:”出现了这样的异常信息,表示的是类转换异常,本 质指的是两个 没有关系的类对象发生了强制转所带来的问题。所以要想进行向下转型操作之前一定要首先保证发 生了向上转型,这样才可以建立父子 对象的关系。 但是可以发现这样的转型本身是会存在有安全隐患的 ,所以在 java 中提供有一个关键字:intanceof 利用此关键字可以判断某一个对象是否是指定类的实例。 对象 instanceof 类 返回 boolean 类型 范例:观察 instanceof 关键字的使用 public class TestDemo public static void main(String args) A a = new A();/父类对象 System.out.println(a instanceof A); System.out.println(a instanceof B); /B b = (B)a;/向下强制转换 /b.print(); 范例:如果发生了向上转型之后的判断 public class TestDemo public static void main(String args) A a = new B();/父类对象 System.out.println(a instanceof A); System.out.println(a instanceof B); /B b = (B)a;/向下强制转换 /b.print(); 范例:利用 instanceof 保证转型的正确性 public class TestDemo public static void main(String args) A a = new B();/父类对象 System.out.println(a instanceof A); System.out.println(a instanceof B); if(a instanceof
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国冷链物流行业集中度提升路径与龙头企业竞争力分析报告
- 社区用房交接协议书6篇
- 2025年横州市属事业单位考试试卷
- 2025北京首都师范大学实验小学招聘2人考前自测高频考点模拟试题及1套参考答案详解
- 2025年智能交通系统的经济效益
- 2025年福建福路通城乡发展集团有限公司招聘考前自测高频考点模拟试题及答案详解(夺冠)
- 2025湖南郴州资兴市公开招聘医疗卫生类专业技术人员28人模拟试卷及参考答案详解一套
- 西藏阿里地区“五类人员”高校毕业生招聘考试真题2024
- 2025吉林二道江区政府专职消防员招聘1人模拟试卷及答案详解(网校专用)
- 安徽池州市妇女儿童医院招聘考试真题2024
- 2025贵州盐业(集团)遵义有限责任公司招聘15人笔试备考试题及答案解析
- 2025年全国保密教育线上培训知识考试试题库有含答案
- EMS供应商对比方案报告
- 2025年上海科学考试题目及答案
- 试点先行人工智能+智能客服系统可行性分析
- 兵团面试题目及答案
- 监护仪使用及报警设置
- 通过模拟实验探究膜的透性 说课课件
- 管理会计(1)-课件
- Q-SY 08365-2021 气瓶使用安全管理规范
- GB/T 29163-2012煤矸石利用技术导则
评论
0/150
提交评论