/*
需求:多态测试
*/
//定义一个抽象父类
abstract class Person{
      //吃的方法是子类共有的 ,但是吃的东西不同,所以定义为抽象方法
    abstract void eat();  
}
//工具类,主函数new该类对象,即可调用方法
class DoFunction{
    public static void doFunction(Person p){
            p.eat();
            if(p instanceof Man){//判断P是什么类型
                Man m = (Man)p;//如果是男人类,则向下转型
                m.smok();    
            }else{
                Woman w = (Woman)p;//如果是女人类,则向下转型
                w.shop();    
            }
    }    
} 
 //定义一个子类
class Man extends Person{
    public void eat(){
        System.out.println("吃肉");    
    }    
     
    public void smok(){
        System.out.println("抽烟");    
    }
}
  //定义一个子类
class Woman extends Person{
    public void eat(){
        System.out.println("吃蔬菜");    
    }
     
    public void shop(){
        System.out.println("购物");    
    }
}
 
 //主函数
class PersonDemo{
    public static void main(String []args){
        /*
        Person p = new Man();//向上转型,将男人强制变成人
        p.eat();//调用父类方法
         
        Man m = (Man)p;//向下转型,将男人变成人后,又变成男人
        m.smok();    //调用男人的方法
        */
       // p.doFunction(new Man());
       DoFunction df = new DoFunction();
       df.doFunction(new Man());
       df.doFunction(new Woman());
    }    
}