面向对象编程之抽象类的概念和作用
抽象的定义
抽象是把多个事物的共性的内容抽取出来,本质就是把我们关注的抽取出来。
抽象类
Java中可以定义没有方法体的方法,该方法由其子类来具体实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
抽象方法的特点
只有方法头没有方法体的方法称为抽象方法
抽象方法用abstract来修饰
抽象方法代表一种不确定的操作或行为
抽象方法不能被调用
抽象类的特点
定义中含有抽象方法的类叫抽象类
抽象类用abstract来修饰
抽象类代表一种抽象的对象类型
抽象类不能被实例化
抽象类中可以有具体方法,可以没有抽象方法
demo:
public class AbstractDemo { public static void main(String[] args){ test1(); } public static void test1(){ //Employee emp=new Employee(1,"张三",3000);//报错 抽象类无法被实例化 JavaTeacher t1=new JavaTeacher(1,"张三",3000); t1.work(); t1.rest(); Employee l1=new Leader(2,"李四",5000,4000);//抽象类也可以作为父类引用变量使用 l1.work(); l1.rest(); System.out.println("——————————————————————————————————"); } } //员工抽象类 abstract class Employee { private int number; private String name; private double salary; public String getName() { return name; } public Employee(int number,String name,double salary){ this.number=number; this.name=name; this.salary=salary; } //抽象方法的声明 public abstract void work(); //抽象类,普通方法 public void rest(){ System.out.println(name+" 下课休息"); } } //java老师类 class JavaTeacher extends Employee //继承抽象类 { public JavaTeacher(int number,String name,double salary){ super(number,name,salary); } //一个类继承了抽象类,要么实现抽象类中的抽象方法,要么继续抽象下去 //实现父类抽象方法 public void work(){ System.out.println(this.getName()+" 进行java教学"); } //可以继续抽象 //public abstract void work(); } //教学总监类 class Leader extends Employee //继承抽象类 { private double allowance;//津贴 public Leader(int number,String name,double salary,double allowance){ super(number,name,salary); this.allowance=allowance; } //实现父类抽象方法 public void work(){ System.out.println(this.getName()+" 培训员工"); System.out.println(this.getName()+" 设计课程体系"); } }
效果:
面向对象编程之设计模式模版方法
定义:一个模版方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体行为
意图:定义了在一个操作中的一个算法框架,把一些步骤推迟到子类去实现。模版方法模式让子类不需要改变算法结构而重新定义特定的算法步骤
demo:
public class TemplateDemo { public static void main(String[] args){ test1(); } public static void test1(){ Teacher t1=new JavaTeacher(); t1.work(); System.out.println("——————————————————————————————————"); Teacher t2=new DBTeacher(); t2.work(); System.out.println("——————————————————————————————————"); } } abstract class Teacher { //一个流程:模版方法 public void work(){ //准备 prepared(); //授课 teaching(); //结束 end(); } public void prepared(){ System.out.println("准备白板笔"); System.out.println("打开投影仪"); } public void end(){ System.out.println("关闭投影仪"); } public abstract void teaching(); } //java老师类 class JavaTeacher extends Teacher //继承抽象类 { //实现父类抽象方法 public void teaching(){ System.out.println("java老师进行java教学"); System.out.println("java老师传授java基础"); } } //DB老师 class DBTeacher extends Teacher //继承抽象类 { //实现父类抽象方法 public void teaching(){ System.out.println("DB老师进行数据库教学"); System.out.println("DB老师指导SQL编写"); } }
效果: