栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

引言

本篇文章主要讲解了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();
//输出结果:
//学生吃饭要营养健康

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

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

 现有一个案例:

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

 

在没有模板的情况下:

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

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

 创作不易,给个三连吧!

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/852250.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号