本篇文章主要讲解了Java中的抽象类的概念、应用情景、抽象类的特点、模板方法模式。希望能够对你在Java的学习过程之中起到一定的帮助。
✍️在Java中,abstract是抽象的意思,可以修饰类、成员方法。
abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。
修饰符 abstract class 类名{
修饰符 abstract 返回值类型 方法名称(形参列表)
}
tips:一个类中定义有抽象方法的话,该类必须也被abstract修饰,否则会报错
//抽象类由abstract修饰 public abstract class Student{ //抽象方法由abstract修饰,不能有代码体 public abstract void study(); }
抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。
此时定义一个抽象类People,在该抽象类中定义了一个抽象方法eat(),由于不同的人吃饭方式是不同的,所以需要由子类重写方法来决定(一个类如果继承了抽象类,必须重写所有方法,或者同样定义为抽象类,否则会报错):
//父类 public abstract class People{ public abstract void eat(); } //子类 public class Student extends People{ @Override public void eat(){ System.out.println("学生吃饭要营养健康"); } } //main方法中调用: Student s = new Student(); s.eat(); //输出结果: //学生吃饭要营养健康
使用场景:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。
现有一个案例:
俗话说的好:“民以食为天”,因此我们每天必不可少的一件事就是——干饭。假设每个人吃饭前的准备和吃饭后的处理都一样,分别是:“饭前勤洗手,饭后勤洗碗”,只有吃饭的过程不同,该如何使用代码去表示呢?
在没有模板的情况下:
//学生吃饭过程: public class Student{ public void eat(){ System.out.println("饭前要勤洗手!"); System.out.println("我是学生,我要吃的健康且有营养。"); System.out.println("饭后要勤洗碗!"); } } Student s = new Student(); s.eat(); //输出结果: //饭前要勤洗手! //我是学生,我要吃的健康且有营养。 //饭后要勤洗碗!
倘若只表示学生的话,并不需要模板,然而此时若需要表达不同种类的人的话,仅需要将吃饭的过程做出修改,其他不变,虽然这样做并不会报错,但是并不合理,重复写同样的代码会造成系统的浪费,此时就提现出模板的重要性。
存在模板的情况:
//创建抽象类People作为模板,饭前和饭后不变,而子类需要对过程修改 public abstract class People { public void eat(){ System.out.println("饭前要勤洗手!"); this.eat_process(); System.out.println("饭后要勤洗碗!"); } public abstract void eat_process(); } //子类继承抽象类,并对eat_process()重写 public class Player extends People { @Override public void eat_process() { System.out.println("我是一名运动员,所以我要吃的多一些!"); } } //main函数 Player p = new Player(); p.eat(); //输出结果: //饭前要勤洗手! //我是一名运动员,所以我要吃的多一些! //饭后要勤洗碗!
通过使用模板,我们就可以只需要改变一部分,其他直接引用过来进行使用
创作不易,给个三连吧!