多态 :
    1.理解多态性:可以理解为一个事物的多种形态,一个操作 不同的对象执行 产生的结果不一样。
    2.何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用)
    3.多态的使用:虚拟方法调用
    有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
    总结:编译,看左边;运行,看右边。
    4.多态性的使用前提:①类的继承关系②方法的重写
    实现多态的两种方式
    1、使用父类作为方法的形式参数
    2、使用父类作为方法的返回值
    LSP 里式替换原则 子类可以替换父类
    实现多态的三个要素:
    1、必须要有继承关系
    2、子类要重写父类的方法
    3、父类引用指向子类对象
    向上转型: 子转父 自动转
    向下转型: 父转子 强制转换
    JavaOOP 多态 - 图1
    场景:
    父类对象中包含了子类对象 想调用子类对象中特有的方法时。
    一般和instanceof运算符 搭配使用 清晰的知道父类对象中包含的子类对象 避免转换出错
    instanceof关键子的使用:
    a insetanceof A:判断对象a是否是类A的实例。如果是,返回true,如果不是返回false.
    使用情景:为了避免在向下转型是出现ClassCastException的异常,我们在向下转型之前,先进行insetanceof的判断,一但返回true,就进行向下转型。如果返回false,不进行向下转型。
    如果a insetanceof A 放回true,则a insetanceof B也返回true。
    其中,类B是类A的父类
    示例:
    问题1:编译时通过,运行时不通过
    举例1:
    (父类)Person p3 = new (子类)Woman();
    (子类)Man man = (Man)p3;
    举例2:
    Person p4 = new Person();
    Man m4 = (Man)p4;
    问题2:编译通过,运行时也通过
    (祖先)Object obj = new Woman();
    Person p = (Person)obj;
    问题3:编译不通过
    Man m5 = new Woman();
    String str = new Date();