第6讲Java的多态性,抽象类与接口(免费阅读).pptVIP

  • 22
  • 0
  • 约1.44万字
  • 约 68页
  • 2017-01-01 发布于重庆
  • 举报

第6讲Java的多态性,抽象类与接口(免费阅读).ppt

多态的一些细节 假定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=BaseVar who.staticVar=StaticBaseVar Sub method Static 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()方法。一个实例所属的类肯定实现了父类中 所有的抽象方法(否则这个类不能被实例化)。 再看一个例子: public class A{ void method(){System.out.println(Base);} void test(){method();} } public class B extends A{ void method(){System.out.println(Sub);} public static void main(String args[]){ new A().test(); //调用类A的method()方法 new B().test(); //调用类B的method()方法 } 多态的一些细节 运行这段代码将打印: Base Sub test()方法在父类A中定义,它调用了method()方法,和上面一个例子的区别是父类A的method()方

文档评论(0)

1亿VIP精品文档

相关文档