一、抽象类的概念和作用
1.抽象的定义
抽象是把多个事物的共性的内容抽取出来,本质就是把我们关注的内容抽取出来。(比如:宝马、奔驰都属于汽车,汽车是抽象出来的概念)
2.抽象类
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
3.抽象方法的特点
(1)只有方法头没有方法体的方法称之为抽象方法。(即只有方法的声明,没有方法的实现)
(2)抽象方法用abstract关键字来修饰。
(3)抽象方法代表一种不确定的操作或行为。(由子类去具体实现)
(4)抽象方法不能被调用。
4.抽象类的特点
(1)定义中含有抽象方法的类叫做抽象类。
(2)抽象类用abstract关键字来修饰。
(3)抽象类代表一种抽象的对象类型。
(4)抽象类不能实例化。
(5)抽象类中可以有具体方法,可以没有抽象方法。(也就是说一个类中只要有一个方法是抽象方法那么这个类一定是抽象类,反过来,一个抽象类中可以没有抽象方法,可以带有具体
实现的方法)
(6)一旦一个类中有抽象方法,那么这个类必须也要用abstract来修饰,代表这个类是抽象类,它是不能被实例化的。
如:
① A是一个抽象类
public abstract class A{
public void methodA(){
System.out.println("test");
}
}
② public abstract void methodB();
用abstract来修饰的方法称之为抽象方法,抽象方法的特点就是只有方法的声明,没有方法的实现。这里不能这样写:public abstract void methodB(){},因为写了大括号就代表有
方法的实现,只不过这是一个空实现,即没有大括号的才称为方法的声明。
public abstract class Employee {
private int number;
private String name;
private double salary;
public Employee(int number, String name, double salary) {
this.number = number;
this.name = name;
this.salary = salary;
}
// 抽象方法的声明(抽象类中不推荐放具体实现的方法)
public abstract void work();
}
// 一旦一个类继承了抽象类,那么这个类要么实现抽象类中的抽象方法,要么继续抽象下去。
public class JavaTeacher extends Employee {
public JavaTeacher(int number, String name, double salary) {
super(number, name, salary);
}
@Override
public void work() {
System.out.println("上java课");
}
}
public class Leader extends Employee {
private double allowance;
public Leader(int number, String name, double salary, double allowance) {
super(number, name, salary);
this.allowance = allowance;
}
@Override
public void work() {
System.out.println("培训新员工");
System.out.println("设计课程体系");
}
}
public class EmployeeDemo {
public static void main(String[] args) {
JavaTeacher javaTeacher = new JavaTeacher(1001, "张三", 10000);
// 父类的引用变量可以引用其子类对象(这里抽象类Employee也是一个父类,通过父类的引用变量引用值实现多态),所以也可以这么写:
// Employee javaTeacher = new JavaTeacher(1001, "张三", 10000);下同。
javaTeacher.work();
Leader leader = new Leader(101, "李四", 20000, 50000);
leader.work();
// 抽象类不能实例化
// Employee employee = new Employee(1,"小王",2000,50000);
}
}
备注:抽象类为什么不能实例化?
抽象类中是可以包含抽象方法,不是必须。如果一个抽象类没有一个抽象方法,那么他和一个普通java类就没有任何区别了,也就是说,在这种情况下没有abstract修饰都是一样的。定义了一个包含抽象方法的抽象类,其子类在继承自该抽象类的时候,子类就必须实现父类的所有抽象方法。之所以在java中存在这样一个语法规范,就是为了定义这种类型结构来解决生活中这样的一些实际问题。
你看过周星驰的电影没,就是那个去水果店,揪住老板说要一斤水果!老板问他你要什么水果,他说他就要水果!这个水果就是抽象类,你如果能在水果店买到一斤叫水果的水果,那就能实例化一个抽象类。要跟现实生活联系起来。
5.模板方法模式
(1)定义:一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体行为。
(2)意图:定义了在一个操作中的一个算法框架,把一些步骤推迟到子类去实现。模板方法模式让子类不需要改变算法结构而重新定义特定的算法步骤。
public class TemplateDemo {
public static void main(String[] args) {
DBTeacher dbTeacher = new DBTeacher();
dbTeacher.work();
System.out.println("===========我是一道闪电=========");
CTeacher cTeacher = new CTeacher();
cTeacher.work();
}
}
abstract class Teacher{
// 老师工作的方法是一个流程,也可以认为是一个模板方法(即模板方法中的每一个步骤是固定的,老师授课按这个模板方法执行就可以了)
public void prepared() {
System.out.println("准备好白板笔");
System.out.println("打开投影仪");
}
public void end() {
System.out.println("关闭投影仪");
System.out.println("锁教室门");
}
/**
* 这是一个抽象方法由其子类去实现
*/
public abstract void teaching();
public void work() {
// 授课前准备
prepared();
// 进行授课
teaching();
// 授课结束
end();
}
}
class DBTeacher extends Teacher{
// 实现父类抽象的方法
@Override
public void teaching() {
System.out.println("打开Oracle软件");
System.out.println("书写sql指令");
System.out.println("优化sql指令");
}
}
class CTeacher extends Teacher {
// 实现父类的抽象方法
@Override
public void teaching() {
System.out.println("打开VM软件");
System.out.println("书写C指令");
System.out.println("调试C程序");
}
}