多态存在的三个必要条件
继承
重写
父类引用指向子类的对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
实例:
public class Test { public static void main(String[] args) { Animal a = new Cat(); //向上转型 a.eat(); //调用的是Cat的eat Cat c = (Cat)a; //向下转型 c.worrk(); //调用的是Cat的work() } } class Animal{ //父类 public void eat() { System.out.println("动物要吃东西~~~"); } } class Dog extends Animal{ //子类 public void eat() { System.out.println("狗狗要吃骨头~~~"); } public void work() { System.out.println("狗狗要看家!!!"); } } class Cat extends Animal{ //子类 public void eat() { System.out.println("猫咪要吃小鱼~~~"); } public void worrk() { System.out.println("猫咪要抓老鼠!!!"); } }
运行结果:
猫咪要吃小鱼~~~
猫咪要抓老鼠!!!
我们主要来分析下面这一段代码:
Animal a = new Cat(); //向上转型
Animal 是引用类型,声明了 a 这个对象可以做哪些事,但是在对象生成的过程中,用的是 Cat 类的构造器,所以Animal相当于一个空头支票,对象 a 实际上能做的事是 Cat 决定的。此时的 a 可以调用 Cat 类或者以 Cat 类为父类的子类里面的成员变量和成员方法,而不能调用 Animal 类里面的成员变量和成员方法。
为什么叫向上转型呢?因为 a 是属于 Cat 里面的对象,而它的引用类型是 Animal,显然,Animal是 Cat 的父类,高于 Cat,所以类型就相当于向上转型了。
Cat c = (Cat)a; //向下转型
这行代码中,Cat 是引用类型,创建了一个对象 c ,并且给 c 赋值为 a。因为一开始 a 是 Animal 类型的,所以要做一次强制类型转换才能和前面的 c 配得上。这就叫做向下转型。
但是,做强制类型转化是有条件的,对象的能实际使用的哪个类型(a 实际使用的类型是Cat)不能低于将要转化的类型。
举个例子,如下图:
向上类型转换就向是茶杯往茶壶里倒水,即便全部倒进去也不用担心溢出。
但是向下类型转换就有风险了,一不小心就有可能把水倒的溢出。
多态的实现方式
方式一:重写:
https://www.cnblogs.com/chuijingjing/p/9461729.html
方式二:接口
https://www.cnblogs.com/chuijingjing/p/9472472.html