package day01; /** * 多态:可以理解为一种事物的多种形态 * 对象的多态性:父类的引用指向子类的对象 (或是子类的对象赋给父类的引用) *多态的使用:虚拟方法调用,有了对象的多态性以后,在编译期间,只能调用父类中声明的方法,但是在运行期间,实际调用的是子类重写父类的方法 *多态的使用前提:1.类的继承关系 2.方法的重写
*对象的多态性只使用与方法,不适用属性 */ public class AnimalTest { public static void main(String[] args){ AnimalTest at = new AnimalTest(); at.fun(new Cat()); //这也可以new Dog ,这就是多态性的使用 } public void fun(Animal animal){ //Animal animal= new Cat(); animal.eat(); animal.shout(); } //假如说没有多态性,就只能像下面这样需要造很多方法去调用,很麻烦,所以有了多态性 // public void fun1(Dog dog){ // dog.eat(); // dog.shout(); // } // public void fun1(Cat cat){ // cat.eat(); // cat.shout(); // } } class Animal{ public void eat(){ System.out.println("动物进食"); } public void shout(){ System.out.println("动物:吃"); } } class Dog extends Animal{ public void eat(){ System.out.println("狗吃骨头"); } public void shout(){ System.out.println("汪!汪!汪!"); } } class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); } public void shout(){ System.out.println("喵!喵!喵!"); } }
多态情况下的虚拟方法调用
子类中定义了与父类同名同参数的方法,在多态情况下,将此时的父类方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于该子类的方法,这样的方法调用在编译期是无法确定的,因此多态的方法调用是运行时行为(也叫做动态绑定)