/*
  学生案例
    具体事务:基础班学员,就业班学员
    共性:姓名,年龄,班级,学习,吃饭
    
  分析:从具体到抽象
    基础班学员:
      成员变量:姓名、年龄、班级
      构造方法:无参、带参
      成员方法:学习、吃饭
    就业班学员:
      成员变量:姓名、年龄、班级
      构造方法:无参、带参
      成员方法:学习、吃饭
      
    因为有共性的内容,所以提取出一个父类。学生类。
    但是由于学习的内容不一样所以,学习方法是抽象法,
    而方法是抽象,类就必须定义为抽象的
    
    学员类:
      成员变量:姓名、年龄、班级
      构造方法:无参、带参
      成员方法:学习、吃饭
  
  实现:从抽象到具体
    学员类:
      成员变量:姓名、年龄、班级
      构造方法:无参、带参
      成员方法:getXxx()/setXxx(),学习study(抽象方法)、吃饭eat(方法)
    
    基础班学员:
      继承自学员类
      重写学习方法
    就业班学员:
      继承自学员类
      重写学习方法
*/
//定义抽象学员类
abstract class Student{
  //姓名
  private String name;
  //年龄
  private int age;
  //班级
  private String grand;
  
  public Student(){}
  
  public Student(String name,int age,String grand){
    this.name = name;
    this.age = age;
    this.grand = grand;
  }
  
  //getXxx()/setXxx()
  public String getName(){
    return name;
  }
  
  public void setName(String name){
    this.name = name;
  }
  
  public int getAge(){
    return age;
  }
  
  public void setAge(int age){
    this.age = age;
  }
  
  public String getGrand(){
    return grand;
  }
  
  public void setGrand(String grand){
    this.grand = grand;
  }
  
  //学习study(抽象方法)
  public abstract void study();
  
  //吃饭eat(具体方法)
  public void eat(){
    System.out.println("学习累了,去吃饭");
  }
}
//定义具体基础班学员类
class BasicStudent extends Student{
  public BasicStudent(){}
  
  public BasicStudent(String name,int age,String grand){
    super(name,age,grand);
  }
  
  public void study(){
    System.out.println("基础班学员学习的是JavaSE");
  }
}
//定义具体就业班学员类
class WorkStudent extends Student{
  public WorkStudent(){}
  
  public WorkStudent(String name,int age,String grand){
    super(name,age,grand);
  }
  
  public void study(){
    System.out.println("就业班学员学习的是JavaEE");
  }
}
class AbstractTest3{
  public static void main(String[] args){
    //基础班学员测试
    //多态(测试)
    //方式1
    Student s = new BasicStudent();
    s.setName("小刚");
    s.setAge(20);
    s.setGrand("bdqn_S1");
    System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
    s.study();
    s.eat();
    System.out.println("---------------------------------");
    //方式2
    s = new BasicStudent("小刚",20,"bdqn_S1");
    System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
    s.study();
    s.eat();
    System.out.println("---------------------------------");
    //就业班学员测试
    //方式1
    s = new WorkStudent();
    s.setName("小明");
    s.setAge(25);
    s.setGrand("bdqn_Y2");
    System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
    s.study();
    s.eat();
    System.out.println("---------------------------------");
    //方式2
    s = new BasicStudent("小明",25,"bdqn_Y2");
    System.out.println(s.getName()+"---"+s.getAge()+"---"+s.getGrand());
    s.study();
    s.eat();
    System.out.println("---------------------------------");
  }
}