package cn.china;
/**
 * 抽象类
 * 抽象:笼统,模糊,看不懂,不具体
 * 
 * 特点:
 * 1、方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。
 * 轴向方法必须定义在抽象类中,该类必须也被abstract修饰
 * 2、抽象类不可以被实例化,为什么?因为调用抽象方法没意义。
 * 3、抽象类必须由其子类覆盖了所有抽象方法后,该子类才可以实例化,
 * 否则该子类也是一个抽象类,不可以实例化
 * 五个问题:
 * 1、抽象类中有构造函数?
 * 有,用于给子类对象进行初始化
 * 2、抽象类中可不可以不定义抽象方法?
 * 可以的,但是很少见,目的就是不让该类创建对象,AWT的适配器对象就是这种类。
 * 通常这个类中方法有方法体却没有内容。
 * 3、抽象关键字不可以和哪些关键字共存?
 * private 不行,抽象方法时要被覆盖的,私有以后子类就继承不到该方法了
 * static 不行,静态以后不用对象就可以使用,但是抽象方法没有具体意义,所以不能使用
 * final 不行
 * 4、抽象类和一般类的异同点?
 * 相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。
 * 不同点:一般类有足够的信息描述事物,抽象类描述事物的信息不足;
 * 一般类中不能定义抽象方法只能定义非抽象,抽象类中可以定义抽象方法也可以定义非抽象方法;
 *一般类可以被实例化,抽象类不能被实例化;
 *5、抽象类一定是父类?
 *是的,因为需要子类覆盖其方法后,才可以被子类实例化; 
 * abstract class Demo{
 * void show(){}
 * void show2(){}
 * }*/
abstract class Employee{
    private String name;
    private String id;
    private double pay;
    Employee(String name,String id,double pay){
        this.name=name;
        this.id=id;
        this.pay=pay;
    }
    public abstract void work();
}
class Programer extends Employee{
    Programer(String name,String id,double pay){
        super(name, id, pay);
    }
    public void work(){
        System.out.println("code.....");
    }
}
class Manager extends Employee{
    private int bonus;
    Manager(String name,String id,double pay,int bonus){
        super(name, id, pay);
        this.bonus=bonus;
    }
    public void work(){
        System.out.println("mananger.....");
    }
}
abstract class Demo{
    abstract void show();
}
class DemoA extends Demo{
    void show(){
        
    }
}
class DemoB extends Demo{
    void show(){
        
    }
}
public class AbstractDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}