




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 芋头粗加工管理制度
- 英语社团机管理制度
- 财务会计管理制度范本
- 财务管理项目化教材习题参考答案
- 财务部月度工作计划格式
- 财务会计应用补充练习
- 视觉感知行业面临的挑战分析
- 计算机网络技术基础 教案
- 山东省济宁市邹城市第一中学2024-2025学年高一下学期5月月考生物试卷(有答案)
- 江苏省南通市期末模拟试卷(含答案)2024-2025学年统编版语文八年级下册
- 凉山州木里县选聘社区工作者笔试真题2024
- 2025年安徽省高考物理试卷真题(含答案解析)
- 配电线路高级工练习试题附答案
- (2025)干部任前廉政知识考试题库及答案
- 护士N2理论考试试题及答案
- 2025年河北省中考麒麟卷地理(二)
- 第23课+和平发展合作共赢的时代潮流+课件高一历史下学期统编版(2019)必修中外历史纲要下
- GB/T 45439-2025燃气气瓶和燃气瓶阀溯源二维码应用技术规范
- YC/T 620-2024烟草零售客户满意度调查规范
- 《公路桥梁挂篮设计与施工技术指南》
- 16J914-1 公用建筑卫生间
评论
0/150
提交评论