
向上转型用的更多一些
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();
 
 
    }
}
 
                         
                                

