/* * 当多个类中出现相同功能,但功能主体不同 * 这时可以进行向上抽取,这时只抽取功能定义,而不抽取功能主体 * * 抽象类的特点: * 1、抽象方法一定定义在抽象类中 * 2、抽象方法和抽象类都必须被abstract关键字修饰 * 3、抽象类不可以用new创建对象,因为调用抽象方法没意义 * 4、抽象类中的方法要被使用,必须由子类复写其所有抽象方法后,建立子类对象使用 * 如果子类只覆盖了部分抽象方法,那么该子类还是抽象类 * * 抽象类和一般类没有太大不同 * 该如何描述事物就如何描述事物,只不过事物中出现了一些不确定的东西 * 这些不确定的部分,也就是该事物的功能,需要明确出现,但是无法定义主体 * 通过抽象方法来表示 * * 抽象类比一般类多了抽象函数,就是在类中可以定义抽象方法 * 抽象类不可以实例化 * * 特殊;抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象 * * */ abstract class AllStudent { abstract void study(); void sleep(){ System.out.println("sleep"); } } class BaseStudent extends AllStudent{ void study() { System.out.println("base study"); } } class AdvStudent extends AllStudent{ void study() { System.out.println("adv study"); } }
上面的代码中BaseStudent和AdvStudent都实现了AllStudent接口,覆盖了接口中的stduy()方法
下面举个例子;
/* * 开发一个系统时需要对员工进行建模。 * 员工包含3个属性:姓名,工号,工资。 * 经理也是员工,除了含有员工的属性外,还有一个奖金的属性 * 请使用继承的思想设计出员工类和经理类,要求类中提供必要的方法进行属性访问 * */ abstract class Employee { private String emp_name; // 员工姓名 private int emp_no, // 员工工号 emp_salary; // 员工工资 Employee(String name, int no, int salary) { this.emp_name = name; this.emp_no = no; this.emp_salary = salary; } public abstract void work(); } class NomalEmployee extends Employee { NomalEmployee(String name, int no, int salary) { super(name, no, salary); } public void work() { System.out.println("普通员工工作"); } } class Manager extends Employee { int bonus; // 经理奖金 Manager(String name, int no, int salary, int bonus) { super(name, no, salary); this.bonus = bonus; } public void work() { System.out.println("经理工作"); } }
如果不抽象出Employee类,直接声明员工类,然后让经理继承员工类再添加奖金属性,是有问题的,如果这样继承的话,就说明经理类中会存在员工类里的work()方法。然而实际生活中经理只需要布置任务给员工即可,不需要去知道是怎么完成的,也不需要自己去完成,所以我们要把经理和员工向上抽取出一个抽象雇员类,经理和员工都是雇员,他们都有姓名,工号,工资的属性,工作的方法(因为工作的具体内容不同,所以定义为抽象方法,等子类实现)。
--------------------By 仔鸡