- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java的多态性,抽象类与接口1讲解
多态的一些细节 假如两种类型之间没有继承关系,即不在继承树的同一个继承分支上,那么Java编译器不允许进行类型转换,例如: Dog dog=new Dog();Cat cat=(Cat)dog; //编译出错,不允许把Dog引用类型转换为Cat引用类型 (2)对于一个引用类型变量,运行时Java虚拟机按照它实际引用的对象来处理。例如以下代码虽然编译可以通过,但运行时会抛出ClassCastException运行时异常: Base who=new Base(); //who引用Base类的实例Sub s=(Sub)who; //运行时抛出ClassCastException 在运行时,子类的对象可以转换为父类类型,而父类的对象实际上无法转换为子类类型。因为通俗的讲,父类拥有的成员子类肯定也有,而子类拥有的成员父类不一定有。 多态的一些细节 假定Java虚拟机能够把子类对象转换为父类类型,那么以下代码中的sub.subMethod()方法无法执行: Base who=new Base(); //who引用Base类的实例Sub sub=(Sub)who; //假定运行时未出错sub.subMethod(); //sub引用变量实际上引用Base实例,而Base实例没有subMethod()方法 由此可见,在运行时,Java虚拟机无法把子类对象转变为父类类型。以下代码尽管能够编译成功,但在运行时,creature变量引用的Cat对象无法转变为Dog类型,因此会抛出ClassCastException: Creature creature=new Cat(); Animal animal=(Animal)creature; //运行正常,Cat对象可转换为Animal类型Cat cat=(Cat)creature; //运行正常,Cat对象可以被Cat类型的引用变量引用Dog dog=(Dog)creature; //运行时抛出ClassCastException,Cat对象不可转换为Dog类型 (但是会编译成功) (3)在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则: 1)成员(实例)方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的。 2)静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。 3)成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量绑定,这种绑定属于静态绑定,因为实际上是在编译阶段就已经作了绑定。 多态的一些细节 例如,对于以下这段代码: Base who=new Sub(); //who被声明为Base类型,引用Sub实例对象System.out.println(who.var=+who.var); //打印Base类的var变量System.out.println(who.staticVar=+who.staticVar); //打印Base类的staticVar变量who.method(); //打印Sub实例的method()方法who.staticMethod(); //打印Base类的staticMethod()方法 运行时将会输出如下结果: who.var=BaseVarwho.staticVar=StaticBaseVarSub methodStatic Base method 多态的一些细节 再看一个例子: public abstract class A{abstract void method();void test(){method(); //到底调用哪个类的mehtod()方法?} }public class B extends A{void method(){ //覆盖父类的method()方法System.out.println(Sub);}public static void main(String args[]){new B().test();}} 多态的一些细节 运行类B的main()方法将打印Sub。 方法test()在父类A中定义,它调用了方法method()。虽然方法method()在类A 中被定义为是抽象的,它仍然可以被调用,因为在运行时环境中,Java虚拟机会执行类B的实例的method()方法。一个实例所属的类肯定实现了父类中 所有
您可能关注的文档
最近下载
- pep人教版六年级上学期英语全学期课时作业练习题.doc VIP
- 电气控制与PLC教案.pdf VIP
- NBT20277-2014 A240(S32101)双相不锈钢焊接规范.pdf VIP
- 2025秋人教版(PEP)(2024)三年级上册英语教学计划.docx VIP
- 初一英语文化课件.pptx VIP
- 高标准农田监理大纲方案投标文件(技术方案).doc
- 第一单元 第1课《可爱的我们》核心素养教学设计 2025湘美版美术三年级上册.pdf
- 2025云南省中职职教高考职业技能考烹饪类专业理论测试模拟05.doc VIP
- 客服人员心态与沟通技巧培训PPT.pptx VIP
- 农村公共卫生与健康促进.pptx VIP
文档评论(0)