publicclassDynamicDispatch{staticabstractclassHuman{protectedabstractvoidsayHello();}staticclassManextendsHuman{@OverrideprotectedvoidsayHello(){System.out.println("man say hello");}}staticclassWomanextendsHuman{@OverrideprotectedvoidsayHello(){System.out.println("woman say hello");}}publicstaticvoidmain(String[] args){Human man =newMan();Human woman =newWoman();
man.sayHello();// invokevirtual #22; //Method org/fenixsoft/polymorphic/DynamicDispatch$Human.sayHello:()V
woman.sayHello();// invokevirtual #22; //Method org/fenixsoft/polymorphic/DynamicDispatch$Human.sayHello:()V
man =newWoman();
man.sayHello();}}//运行结果:
man say hello
woman say hello
woman say hello
分析:
Human man = new Man();中的“Human”称为变量的“静态类型”也即父类对象,后面的“Man”则被称为变量的“实际类型”也即子类对象;
多态是指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特性也需要编程语言提供特殊的语法机制来实现编程语言要支持父类对象可以引用子类对象;编程语言要支持继承;编程语言要支持子类可以重写(override)父类中的方法;java中的多态重写示例:public class DynamicDispatch { static abstract class Human { protected abstract void sayHello();