多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数实现的。
Java 的多态实现有以下几个条件:
继承 重写 父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理
public class polymorphicTEST { public static void main ( String[ ] args) { show ( new Cat ( ) ) ; show ( new Dog ( ) ) ; Animal a = new Cat ( ) ; a. eat ( ) ; Cat c = ( Cat) a; c. work ( ) ; } public static void show ( Animal a) { a. eat ( ) ; if ( a instanceof Cat ) { Cat c = ( Cat) a; c. work ( ) ; } else if ( a instanceof Dog ) { Dog c = ( Dog) a; c. work ( ) ; } }
} abstract class Animal { abstract void eat ( ) ;
} class Cat extends Animal { public void eat ( ) { System. out. println ( "吃鱼" ) ; } public void work ( ) { System. out. println ( "抓老鼠" ) ; }
} class Dog extends Animal { public void eat ( ) { System. out. println ( "吃骨头" ) ; } public void work ( ) { System. out. println ( "看家" ) ; }
}
仔细观察可以看到它首先在主方法中把show的两种调用方法写好了,之后的向上转型把子类型的范围扩大
底下由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类。抽象的类无法进行实例化,因为他不是具体存在的类,或者说这样的类还不够完善,不能直接使用new关键字调用其构造器生成该类的对象。
eat是猫与狗都具有的行为,底下的多态继承
程序的输出结果如下: