/*
* 当多个类中出现相同功能,但功能主体不同
* 这时可以进行向上抽取,这时只抽取功能定义,而不抽取功能主体
*
* 抽象类的特点:
* 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 仔鸡