image.png
    向上转型用的更多一些
    package com.atguigu.java;
    public class PersonTest {
    public static void main(String[] args){

    //对象的多态性:父类的引用指向子类的对象
    Person p2 = new Man();
    //多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法—-虚拟方法调用
    p2.eat();
    p2.walk();

    System.out.println(“**“);

    //不能调用子类所特的方法、属性:编译时,p2是Person类型。
    // p2.earnMoney();
    // p2.isSmoking();

    //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量
    //声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特的属性和方
    //法不能调用。

    //如何才能调用子类特有的属性和方法?
    //向下转型:使用强制类型转换符
    Man m1 = (Man)p2;
    m1.earnMoney();
    m1.isSmoking = true;

    //使用强转时,可能出现ClassCastException的异常。
    // Woman w1 = (Woman)p2;
    // w1.goShopping();

    /
    instanceof:关键字的使用

    a instanceof A:判断对象a是否是类A的实例。如果是返回true;如果不是,返回false

    使用情景:为了避免在向下转型是出现ClassCastException的异常,我们在向下转型之前,先进
    行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,则不进行向下转型。

    /
    if(p2 instanceof Woman ){
    Woman w1 = (Woman)p2;
    w1.goShopping();
    System.out.println(“**
    Woman*“);
    }

    if(p2 instanceof Man ){
    Man m2 = (Man)p2;
    m2.earnMoney();
    System.out.println(“**Man**“);
    }

    //练习:
    //问题一:编译时通过,运行时不通过
    //举例一:
    // Person p3 = new Woman();
    // Man m3 = (Man)p3;

    //举例二;
    // Person p4 = new Person();
    // Man m4 = (Man)p4;

    //问题二:编译时通过,运行时也通过
    Object obj = new Woman();
    Person p = (Person)obj;

    //问题二:编译不过,运行也不过
    // Man m5 = new Woman();

    // String str = new Date();


    }
    }