Java之抽象类的详解

news/2024/6/29 12:16:54 标签: java, 开发语言, 面向对象, 笔记,

1.1 概述

1.1.1 抽象引入

中的方法,被它的子们重写,子各自的实现都不尽相同。那么父的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子对象会调用自己重写的方法)。换句话说,父可能知道子应该有哪个功能,但是功能具体怎么实现父是不清楚的(由子自己决定),父只需要提供一个没有方法体的定义即可,具体实现交给子自己去实现。我们把没有方法体的方法称为抽象方法。Java语法规定,包含抽象方法的就是抽象

  • 抽象方法 : 没有方法体的方法。

  • 抽象:包含抽象方法的

1.2 abstract使用格式

abstract是抽象的意思,用于修饰方法方法和,修饰的方法是抽象方法,修饰的是抽象

1.2.1 抽象方法

使用abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。

定义格式:

java">修饰符 abstract 返回值型 方法名 (参数列表);

代码举例:

java">public abstract void run()

1.2.2 抽象

如果一个包含抽象方法,那么该必须是抽象注意:抽象不一定有抽象方法,但是有抽象方法的必须定义成抽象

定义格式:

java">abstract class 名字 { 
  
}

代码举例:

java">public abstract class Animal {
    public abstract void run();
}

1.2.3 抽象的使用

要求:继承抽象的子必须重写父所有的抽象方法。否则,该子也必须声明为抽象

代码举例:

java">// 父,抽象
abstract class Employee {
    private String id;
    private String name;
    private double salary;
    
    public Employee() {
    }
    
    public Employee(String id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    
    // 抽象方法
    // 抽象方法必须要放在抽象中
    abstract public void work();
}
​
// 定义一个子继承抽象
class Manager extends Employee {
    public Manager() {
    }
    public Manager(String id, String name, double salary) {
        super(id, name, salary);
    }
    // 2.重写父的抽象方法
    @Override
    public void work() {
        System.out.println("管理其他人");
    }
}
​
// 定义一个子继承抽象
class Cook extends Employee {
    public Cook() {
    }
    public Cook(String id, String name, double salary) {
        super(id, name, salary);
    }
    @Override
    public void work() {
        System.out.println("厨师炒菜多加点盐...");
    }
}
​
// 测试
public class Demo10 {
    public static void main(String[] args) {
        // 创建抽象,抽象不能创建对象
        // 假设抽象让我们创建对象,里面的抽象方法没有方法体,无法执行.所以不让我们创建对象
//      Employee e = new Employee();
//      e.work();
        
        // 3.创建子
        Manager m = new Manager();
        m.work();
        
        Cook c = new Cook("ap002", "库克", 1);
        c.work();
    }
}

此时的方法重写,是子对父抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法

1.3 抽象的特征

抽象的特征总结起来可以说是 有得有失

有得:抽象得到了拥有抽象方法的能力。

有失:抽象失去了创建对象的能力。

其他成员(构造方法,实例方法,静态方法等)抽象都是具备的。

1.4 抽象的细节

不需要背,只要当idea报错之后,知道如何修改即可。

关于抽象的使用,以下为语法上要注意的细节,虽然条目较多,但若理解了抽象的本质,无需死记硬背。

  1. 抽象不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子的对象。

    理解:假设创建了抽象的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。

  2. 抽象中,可以有构造方法,是供子创建对象时,初始化父成员使用的。

    理解:子的构造方法中,有默认的super(),需要访问父构造方法。

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

    理解:未包含抽象方法的抽象,目的就是不想让调用者创建该对象,通常用于某些特殊的结构设计。

  4. 抽象的子,必须重写抽象父所有的抽象方法,否则子也必须定义成抽象,编译无法通过而报错。

    理解:假设不重写所有抽象方法,则中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。

  5. 抽象存在的意义是为了被子继承。

    理解:抽象中已经实现的是模板中确定的成员,抽象不确定如何实现的定义成抽象方法,交给具体的子去实现。

1.5 抽象存在的意义

抽象存在的意义是为了被子继承,否则抽象将毫无意义。抽象可以强制让子,一定要按照规定的格式进行重写。


http://www.niftyadmin.cn/n/4961360.html

相关文章

前后端接口规范 - RESTful 版

本规范的三个目标:简洁、统一、开放。 关于如何设计良好风格的 RESTful API,请查看Github 官方文档。本规范将在其基础之上使用尽可能简单的表述方式从以下几个常见部分作出详细约定: 基础约定创建类接口查询类接口文件类接口敏感类接口图标…

基于Vue的3D饼图

先看效果&#xff1a; 再看代码&#xff1a; <template><div class"container"><div style"height: 100%;width: 100%;" id"bingtu3D"></div></div></template> <script> import "echarts-liqu…

leetcode原题: 堆箱子(动态规划实现)

题目&#xff1a; 给你一堆n个箱子&#xff0c;箱子宽 wi、深 di、高 hi。箱子不能翻转&#xff0c;将箱子堆起来时&#xff0c;下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法&#xff0c;搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。 输入使用数组…

Docker容器:docker数据管理、镜像的创建及dockerfile案例

文章目录 一、docker数据管理1.为何需要docker数据管理2.数据管理类型3.数据卷4.数据卷容器5.容器的互联 二.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dock…

如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Linux 计算机网络基础概论

一、网络基本概念 1、网络 网络是由若干节点和连接这些结点的链路组成&#xff0c;网络中的结点可以是计算机、交换机、路由器等设备。通俗地说就是把不同的主机连接起来就构成了一个网络&#xff0c;构成网路的目的是为了信息交互、资源共享。 网络设备有&#xff1a;交换机…

Linux下jenkins全量迁移到新服务器

文章目录 1、目的2、迁移1&#xff09;查看jenkins的主目录2&#xff09;登录要迁出的服务器打包3&#xff09;找到对应的war包4&#xff09;登录对应迁入服务&#xff0c;上传war包和打包的jenkins数据等5&#xff09;在新的服务器解压迁入的数据等&#xff0c;并查看端口是否…

3.redis数据结构之List

List-列表类型:L&R 列表类型&#xff1a;有序、可重复 Arraylist和linkedlist的区别 Arraylist是使用数组来存储数据&#xff0c;特点&#xff1a;查询快、增删慢 Linkedlist是使用双向链表存储数据&#xff0c;特点&#xff1a;增删快、查询慢&#xff0c;但是查询链表两端…