JAVA中的抽象类

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

猜你喜欢

转载自blog.csdn.net/qq_37325788/article/details/80207474