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 } }