面向对象的三大特征：封装、继承、多态
多态
多态就是同一个对象，在不同时刻不同环境表现出来的不同形态。
多态的前提：
    要具有继承关系(继承父类)，或具有实现关系(实现接口)。
    要进行方法的重写。
    要【父类的引用指向子类的对象】
    父类 对象名=new 子类();

多态有什么好处？
    定义方法的时候，可以使用父类类型作为参数，在使用的时候，使用具体的子类的对象作为实际参数进行操作。

class 食物{

}
汉堡、炸鸡、凉皮、米粉、米饭...

class Person{

    public void eat(食物 sw){ //在声明形式参数的时候，使用的父类类型的引用变量

    }
}
Person p=new Person();
p.eat(new 汉堡());    //实际在调用方法并传递实际参数的时候，使用的是子类的对象。
p.eat(new 炸鸡());
p.eat(new 凉皮());
p.eat(new 米粉());

多态有什么弊端？
    不能使用子类特有的成员。解决方案：向下造型。

多态的转型：
    向上转型 向上造型：
        父类的引用指向子类的对象，就是向上造型
        Animal a=new Cat();
    向下转型 向下造型：
        子类类型 对象名=(子类类型)父类引用;
        Cat c=(Cat)a;   //强行把父类的对象转化为子类

向下转型存在的风险和解决方案：
风险：
    向下转型会带来一定的风险，如果对应的实际类型和目标类型不是同一种类型，
    那么在转换的时候就会出现异常：ClassCastException类型强制转换异常
解决方案：
    使用一个关键字 instanceof
    使用的格式：
        变量名(对象名) instanceof 类型
        判断关键字左边的对象名，是不是右边的类型，如果是返回true，否则返回false。
        if(c instanceof Cat){
            Cat c=(Cat)a;
        }