Java中的抽象类如何理解——详解

引言

本篇文章主要讲解了Java中的抽象类的概念、应用情景、抽象类的特点、模板方法模式。希望能够对你在Java的学习过程之中起到一定的帮助。

概念

✍️在Java中,abstract是抽象的意思,可以修饰类、成员方法

abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法

修饰符    abstract    class  类名{

                     修饰符    abstract   返回值类型   方法名称(形参列表)

tips:一个类中定义有抽象方法的话,该类必须也被abstract修饰,否则会报错

//抽象类由abstract修饰
public abstract class Student{
//抽象方法由abstract修饰,不能有代码体
    public abstract void study();
}

应用情景

抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。

当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。

Java中的抽象类如何理解——详解_第1张图片

此时定义一个抽象类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();
//输出结果:
//学生吃饭要营养健康

抽象类特点 

  • 普通类拥有的,抽象类同样拥有
  • 抽象类中可以没有抽象方法,但是由抽象方法就必须有抽象类
  •  一个类继承了抽象类:必须重写完抽象类的全部抽象方法,否则这个类也必须定义为抽象类。
  • 不能用abstract修饰变量、构造器、代码块
  • 得到了抽象方法,便失去了创建对象的能力

模板方法模式 

 使用场景:当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。

 现有一个案例:

俗话说的好:“民以食为天”,因此我们每天必不可少的一件事就是——干饭。假设每个人吃饭前的准备和吃饭后的处理都一样,分别是:“饭前勤洗手,饭后勤洗碗”,只有吃饭的过程不同,该如何使用代码去表示呢?

Java中的抽象类如何理解——详解_第2张图片

 

在没有模板的情况下:

//学生吃饭过程:
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();
//输出结果:
//饭前要勤洗手!
//我是一名运动员,所以我要吃的多一些!
//饭后要勤洗碗!

通过使用模板,我们就可以只需要改变一部分,其他直接引用过来进行使用

 创作不易,给个三连吧!

Java中的抽象类如何理解——详解_第3张图片

 

 

你可能感兴趣的:(Java基础,java,开发语言)