文章目录
- 1.抽象类的由来
- 2.抽象类用法
- 3.抽象类和抽象方法案例
- 4.抽象类&抽象方法的使用
- 5.抽象类常见疑惑
1.抽象类的由来
父类中的方法在子类中重写之后,在实际使用中,一般都会去调用子类的方法。那么父类中的方法没有太大的实际意义,那么我们就可以把这个方法声明了抽象的
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
- 父类中的方法声明为抽象方法之后,子类就必须重写这个方法。
- 抽象方法一定要抽象类中!
- 抽象方法的作用就是强制子类重写抽象方法!
2.抽象类用法
- 抽象方法定义的格式:
public abstract 返回值类型 方法名(参数);
- 抽象类定义的格式:
abstract class 类名 {
}
看如下代码:
//员工
abstractclass Employee{
public abstract void work();//抽象函数。需要abstract修饰,并分号;结束
}
//讲师
class Teacher extends Employee {
publicvoid work() {
System.out.println("正在讲解Java");
}
}
//助教
class Assistant extends Employee {
publicvoid work() {
System.out.println("正在辅导学生");
}
}
//班主任
class Manager extends Employee {
publicvoid work() {
System.out.println("正在管理班级");
}
}
3.抽象类和抽象方法案例
- 需求说明
实现某公司各种岗位(经理、销售人员、普通员工)的员工薪水计算,输出不同岗位各一名员工的工资。要求使用抽象类实现 - 分析
定义员工抽象类,具有计算薪水的抽象方法
定义子类:经理类、销售人员类、普通员工类,分别继承员工抽象类,重写计算薪水的方法
定义测试类,包含输出薪水的方法,参数为员工对象。
- 父类
/*
* 员工类 父类
*/
public abstract class Emp {
private int number; // 工号
private String name; // 姓名
private double sal; // 基本工资
// 计算薪资 抽象方法
public abstract double jisuanSal();
// ----------------------------------------------------------
public Emp() {
super();
}
public Emp(int number, String name, double sal) {
super();
this.number = number;
this.name = name;
this.sal = sal;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
}
- 项目经理类
/*
* 项目经理 子类
*/
public class PM extends Emp {
private int prize; // 奖金
// 重写抽象方法
@Override
public double jisuanSal() {
return getSal() + prize;
}
// -----------------------------------------------------
public PM() {
super();
}
public PM(int number, String name, double sal, int prize) {
super(number, name, sal);
this.prize = prize;
}
public int getPrize() {
return prize;
}
public void setPrize(int prize) {
this.prize = prize;
}
}
- 销售类
/*
* 销售类
*/
public class SalesMan extends Emp {
private int count; // 软件的销售数量
@Override
public double jisuanSal() {
return count*100+getSal();
}
public SalesMan() {
super();
}
public SalesMan(int number, String name, double sal, int count) {
super(number, name, sal);
this.count = count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
- 普通员工类
/*
* 普通员工类
*/
public class Putong extends Emp {
@Override
public double jisuanSal() {
return getSal();
}
public Putong() {
}
public Putong(int number, String name, double sal) {
super(number, name, sal);
}
}
- 测试类
public class Test {
public static void main(String[] args) {
PM p=new PM(110, "小白", 5000, 1000);
double money = p.jisuanSal(); //获取薪资
System.out.println("经理的薪资是:"+money);
System.out.println("--------------------------------");
SalesMan man=new SalesMan(111, "小花", 100, 1000);
double money1=man.jisuanSal();
System.out.println("销售的薪资是:"+money1);
System.out.println("--------------------------------");
Putong pt=new Putong();
double money3 = pt.jisuanSal();
System.out.println("普通员工的薪资是:"+money3);
}
}
4.抽象类&抽象方法的使用
抽象类无法直接创建对象,只能被子类继承后,创建子类对象。
子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法。
抽象类是拥有构造方法的,供其子类使用。
5.抽象类常见疑惑
- 一个类中有抽象方法,那么这个类一定是抽象的
- 抽象类中也可以有非抽象方法,也就是说抽象类中的方法不一定全部是抽象的
- 抽象类中的抽象方法必须在子类中强制重写!