Java的多态是指同一个方法在不同对象上有不同的行为。它是面向对象编程的一个重要特性,通过多态可以实现代码的灵活性和可扩展性。
在Java中,多态的实现主要依靠两个机制:继承和方法重写。
继承:子类可以继承父类的属性和方法。当子类继承父类后,可以使用父类的引用来引用子类的对象。这样,通过父类的引用调用同名方法时,实际上会调用子类中重写的方法。
方法重写:子类可以重写父类的方法,即在子类中重新定义与父类中同名、同参数列表、同返回类型的方法。当父类的引用指向子类的对象时,调用该方法时会执行子类中的方法。
多态的优点:
提高代码的灵活性和可扩展性:通过多态,可以在不修改原有代码的情况下,通过增加新的子类来扩展程序的功能。
简化代码的编写和维护:通过多态,可以使用父类的引用来统一处理不同子类的对象,减少了代码的重复性。
提高代码的可读性:通过多态,可以使代码更加简洁、清晰,易于理解和维护。
方法的重载和重写就体现了多态
(1)一个对象的编译类型和运行类型可以不一致
Animal animal = new Dog();
编译类型为Animal,运行类型为Dog;
(2)编译类型在定义对象时,就确定了,不能改变;
(3)运行类型可以变化;
Animal animal = new Dog();//编译类型为animal,运行类型为dog;
animal = new Cat();//编译类型为animal,运行类型为cat;
(4)编译类型看等号的左边;运行类型看等号的右边;
(1)本质:父类的引用指向了子类的对象;
(2)语法:父类类型? ? ? ? 引用名=new? ? ? ? 子类类型();
Animal animal = new Dog();
(3)特点:编译类型看左边,运行类型看右边;
可以调用父类中的所有成员(需遵守访问权限),
不能调用子类中特有成员,(因为在编译阶段,能调用哪些成员,是由编译类型决定的)
//animal.catchMause();错误,因为这是子类特有的方法
最终运行效果看子类(运行类型)的具体实现;即调用方法时,按照从子类(运行类型)开始查找重写或重载的方法,如果没有的话,就去父类中找,直到Object类;
(1)语法:子类类型? ? ? ? 引用名=(子类类型)父类引用;
Animal animal = new Dog();
Dog dog = (Dog) animal;
(2)只能强转父类的引用,不能强转父类的对象;
(3)要求父类的引用必须指向的是当前目标类型的对象;
(4)当向下转型后,可以调用子类类型中的所有成员;
(1)属性没有重写之说,属性的值只看编译类型(等号的左边);
(2)instanceOf比较操作符,用于判断对象的运行类型,是否为XX类型或XX类型的子类型