JavaSE面向对象(六)-抽象类
  eZw8kcl3fQWu 2023年11月15日 16 0



文章目录

  • 1.抽象类的由来
  • 2.抽象类用法
  • 3.抽象类和抽象方法案例
  • 4.抽象类&抽象方法的使用
  • 5.抽象类常见疑惑


1.抽象类的由来

JavaSE面向对象(六)-抽象类_Java知识


父类中的方法在子类中重写之后,在实际使用中,一般都会去调用子类的方法。那么父类中的方法没有太大的实际意义,那么我们就可以把这个方法声明了抽象的

分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

JavaSE面向对象(六)-抽象类_Java核心技术_02

  • 父类中的方法声明为抽象方法之后,子类就必须重写这个方法。
  • 抽象方法一定要抽象类中!
  • 抽象方法的作用就是强制子类重写抽象方法!

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.抽象类和抽象方法案例

  • 需求说明
    实现某公司各种岗位(经理、销售人员、普通员工)的员工薪水计算,输出不同岗位各一名员工的工资。要求使用抽象类实现
  • 分析
定义员工抽象类,具有计算薪水的抽象方法
定义子类:经理类、销售人员类、普通员工类,分别继承员工抽象类,重写计算薪水的方法
定义测试类,包含输出薪水的方法,参数为员工对象。

JavaSE面向对象(六)-抽象类_Java核心技术_03

  • 父类
/*
 *  员工类 父类 
 */
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.抽象类常见疑惑

  • 一个类中有抽象方法,那么这个类一定是抽象的
  • 抽象类中也可以有非抽象方法,也就是说抽象类中的方法不一定全部是抽象的
  • 抽象类中的抽象方法必须在子类中强制重写!


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
eZw8kcl3fQWu