11.Java之抽象类

2023-11-02

1. 抽象类

1.1 抽象类概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 比如:

说明:

1.矩形、三角形、圆形都是图形,因此和Shape类的惯性应该是继承关系

2.虽然图形图Shape中也存在draw的方法,但由于Shape类并不是具体的图形,因此其内部的draw方法实际是没有办法实现的。

3.由于Shape类没有办法描述一个具体的图形,导致其draw()方法无法具体实现,因此可以将Shape类设计为“抽象类”。

在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class).

1.2 抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体.

// 抽象类:被abstract修饰的类
public abstract class Shape {
    // 抽象方法:被abstract修饰的方法,没有方法体
    abstract public void draw();
    abstract void calcArea();
    // 抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }
    protected double area; // 面积
}

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

1.3 抽象类特性

1. 抽象类不能直接实例化对象

Shape shape = new Shape();//抽象类无法实例化
// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

2. 抽象方法不能是 private 的

abstract class Shape {
abstract private void draw();
}
// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private

3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写

public abstract class Shape {
abstract final void methodA();
abstract public static void methodB();
}
// 编译报错:
// Error:(20, 25) java: 非法的修饰符组合: abstract和final
// Error:(21, 33) java: 非法的修饰符组合: abstract和static

浅析Java中的final关键字 - Matrix海子 - 博客园 (cnblogs.com)

4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰。

public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
    abstract public void draw();
    abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }
    protected double area; // 面积
}
// 矩形类
public class Rect extends Shape {
    private double length;
    private double width;
    Rect(double length, double width){
        this.length = length;
        this.width = width;
    }
    public void draw(){
        System.out.println("矩形: length= "+length+" width= " + width);
    }
    public void calcArea(){
        area = length * width;
    }
}
// 圆类:
public class Circle extends Shape{
    private double r;
    final private static double PI = 3.14;
    public Circle(double r){
        this.r = r;
    }
    public void draw(){
        System.out.println("圆:r = "+r);
    }
    public void calcArea(){
        area = PI * r * r;
    }
}
// 三角形类:
public abstract class Triangle extends Shape {
    private double a;
    private double b;
    private double c;
    @Override
    public void draw() {
        System.out.println("三角形:a = "+a + " b = "+b+" c = "+c);
    }
// 三角形:直角三角形、等腰三角形等,还可以继续细化
//@Override
//double calcArea(); // 编译失败:要么实现该抽象方法,要么将三角形设计为抽象类
}

5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

1.4 抽象类的作用

抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.

有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?

确实如此. 但是使用抽象类相当于多了一重编译器的校验.

使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.

很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11.Java之抽象类 的相关文章

随机推荐

  • c语言实参和形参占用存储单元_C语言中函数的形参与实参是什么?

    函数的参数分为形参和实参两种形参出现 1 在函数定义中 在整个函数体内都可以使用 离开该函数则不能使用 2 实参出现在主调函数中 进入被调函数后 实参变量也不能使用 数据传送是形参和实参的主要功能 在发生函数调用时 主调函数把实参的值传送给
  • c编写客户端控制机械臂摆动,套接字函数

    include
  • 机器学习基础——数据集与估计器、k近邻算法

    1 sklearn数据集与估计器 2 分类算法 k近邻算法 3 k 近邻算法实例 4 分类模型的评估 5 分类算法 朴素贝叶斯算法 6 朴素贝叶斯算法实例 7 模型的选择与调优 8 决策树与随机森林 1 sklearn数据集与估计器 数据集
  • 测试如何转开发系列(三)

    快速学习法 是我这几年自己总结的一套方法 主要是上班后自由时间较少 这样在尽可能短时间能上手一门语言 也可以是一个工具 一个技术点 这个方法适应面很广 短时间内学习和使用一个新的技术 都可以用这个方法 这个方法优点是高效实用 可以快速入门
  • 向日葵远程软件设置全屏显示的方法

    描述 向日葵远程软件设置全屏显示的方法 步骤 屏幕顶部下箭头 gt 缩放 gt 自适应图像即可
  • 使用SpriteAtlas打包图集并显示

    一 在电脑端编辑器演示 1 图片要必须要设置为Sprite 2D and UI 否则不能装入SpriteAtlas中 2 如果不勾选include in build 会提示SpriteAtlasManager atlasRequested
  • JS监听手机的物理返回键(亲测有效)

    自己弄一个项目 需要用到JS监听物理返回键 网上找了发现大部分人都说无法监听 后面再一个博主那看到一个方法 试了一下可以 特意发出来供大家参考 代码如下 if window history window history pushState
  • 断点续传的原理

    文件断点续传是一种机制 允许在网络传输中的文件传输过程中出现断开连接或传输中断的情况下 能够恢复传输并继续传输未完成的部分 其原理如下 检测支持 首先 服务器端和客户端需要支持文件断点续传功能 服务器必须能够接收并处理客户端请求的文件的部分
  • git clone 一些简单笔记

    自使用了git后 就彻底喜欢上了 深深体会到了自由的感觉 记录一些简单的笔记和使用心得 仅供留迹 以备后查 git clone 命令参数 usage git clone options
  • WordPress的Dashicons图标资源预览

    来自官网 https developer wordpress org resource dashicons grid view
  • mysql字段汇总

    类型 描述 INT 一种数值类型 值的范围如下 带符号的 2147483648 2147483647 不带符号的0 4294967295 最多十位 所以存手机号是不行的 DECIMAL 一种数值类型 支持浮点数或者小数 DOUBLE 一种数
  • git --git-dir_Git简介-第2轮(高级)

    git git dir Git is an incredibly powerful flexible and capable distributed version control system Unfortunately it can a
  • web实验2 制作简单网页(HTML+CSS)

    web实验2 制作简单网页 HTML CSS 一 实验目的 1 掌握文本样式的设置 2 掌握图像样式的设置 3 掌握各种媒体的插入方法 二 实验内容 采用DIV CSS 制作 在线电影 页面 三 操作提示 1 新建网站的文件夹 网站图像素材
  • shell编程中的$0,$1,$2,...,$#,$?含义是什么,$9以上的参数如何表示

    在脚本全局中使用这些变量 bin bash 输出执行脚本时传给脚本的几个参数 echo 0 0号参数是当前脚本的名称 echo 1 传给脚本的第一个参数 echo 2 echo 9 echo 10 10以及10以上的参数需要用 包含起来 e
  • Linux内核笔记 - 内核编译错误及解决方法记录

    错误 1 bin sh 1 lzop not found make 2 arch arm boot compressed piggy lzo 错误 1 make 2 正在等待未完成的任务 make 1 arch arm boot compr
  • VUE+OpenLayer动态显示船舶位置信息

    VUE OpenLayer动态显示船舶位置信息 目前项目中需要使用海图来展示船舶位置信息 特此来总结一下开发心得 使用的是openlayer组件库来实现海图的展示 底图为离线瓦片地图 目标 实现前端定时发请求给后端 依据后端返回数据 在地图
  • Error:java.lang.NullPointerException (no error message)

    今天遇到一个问题 电脑突然关机了 然后重启电脑打开Android studio时 运行程序跑不起来 然后报Error java lang NullPointerException no error message 同时Java文件找不到R文
  • 深度解析:2023年软件测试的10个新趋势和挑战

    随着技术的飞速发展 软件测试的角色和责任也在经历重大转变 我们在2023年目前所面临的一些新趋势和挑战值得所有从业人员关注 以下是这些主要趋势和挑战的深度分析 趋势一 人工智能和机器学习在测试中的应用 AI和ML正在越来越多地应用于软件测试
  • G--爬山---2023河南萌新联赛第(二)场:河南工业大学

    链接 登录 专业IT笔试面试备考平台 牛客网 来源 牛客网 示例1 输入 3 230 100 200 300 输出 192 示例2 输入 3 900 150 150 125 输出 1 解析 二分 include
  • 11.Java之抽象类

    1 抽象类 1 1 抽象类概念 在面向对象的概念中 所有的对象都是通过类来描绘的 但是反过来 并不是所有的类都是用来描绘对象的 如果一个类中没有包含足够的信息来描绘一个具体的对象 这样的类就是抽象类 比如 说明 1 矩形 三角形 圆形都是图