java:Java中的抽象类

news2024/12/26 11:15:51

什么是抽象类

    我们知道,类用来模拟现实的事物,一个类模拟一类事物,某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性,当一个类中给出的信息足够全面时候,我们就可以实例化该类。但是,当一个类中给出的信息不够全面时,比如无法确定行为,它给出的信息不足以描绘出一个具体的对象,这时我们往往不会实例化该类,这种类就是抽象类例如,对于Animal类,所有动物都有吃喝的行为,定义eat可以描述吃这一行为,但每种动吃的都不一样,因此,一个eat方法并不能准确的描述吃什么。这时,Animal给出的信息就不足够描述一个对象,我们就不能去实例化Animal类。

   在Java中,我们通过在类前面添加关键字abstract(抽象的)来定义抽象类。如:

public abstract class Animal {
    //Animal类此时就是一个抽象类。
}
 
class Dog extends Animal {
    //Dog类继承了Animal类,是Animal类的子类。
}

抽象类的定义

  • 抽象方法

        1.我们将“只有方法声明,没有方法体”的一类方法统称为抽象方法抽象方法用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是只需要在()后面添加一个分号即可,否则IDEA会提示报错信息,如下图所示 : 

错误的:

正确的:

 

     2.如果一个类中已经出现了抽象方法,那么,这个类必须定义成抽象类。如:

     总结:因此,有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。 

   


 3.应用:

     当父类需要定义一个方法,却不能明确方法的具体细节时,可以将该方法定义为abstract,具体实现细节延时到子类。

       我以Shape类,Circle类举例,代码如下:

package Test;

 public abstract class Shape {//应添加abstract
     // 抽象方法,用于计算图形的面积
     public abstract double calculateArea();
}
// 子类继承抽象类,并实现抽象方法
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // 实现抽象方法,计算圆的面积
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

   4.特点:

  • 如果父类定义了一个抽象方法,要求其所有的非抽象子类都必须重写该抽象方法,否则idea会报错。

  • 抽象方法不能再使用private,final,static关键字来修饰。这是因为定义抽象方法的目的就是想将方法的具体实现延迟到子类,最终是要被子类重写的,而private,final,static这几个关键字都和“方法重写”的目的背道而驰。

抽象类的特点:

1.抽象类不能被实例化,只能创建其子类对象:

即,我们不能创建抽象类对象(这里的对象指的是堆空间中的真正的对象,即不能new抽象类

2.抽象类子类的两个选择:

即:要么实现父类的所有的抽象方法,要么子类本身也定义成抽象类

抽象类的成员:

1.成员变量

        抽象类既可以有静态的成员变量,也可以有非静态的成员变量
        既可以有静态的成员常量,也可以有非静态的成员常量

2.成员方法

抽象类既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非静态非final,因为abstract关键字与private关键字,static关键字,final关键字不能同时存在);

也可以有非抽象方法(非抽象方法就可以用private,final和static关键字来修饰了,具体使用时,根据实际需求合理应用)。

3.构造器

抽象类可以和非抽象类一样拥有构造器,并且支持构造器的重载。

4.总结

抽象类中的成员只比非抽象类多一种——抽象方法。其他都和非抽象类一样。

5.代码演示

// 定义一个抽象类
abstract class Shape {
    // 抽象方法,用于计算图形的面积
    public abstract double calculateArea();

    // 具体方法,用于打印图形的信息
    public void printInfo() {
        System.out.println("这是一个" + getShapeName() + ",面积为:" + calculateArea());
    }

    // 具体方法,用于获取图形的名称
    public abstract String getShapeName();
}

// 子类继承抽象类,并实现抽象方法
class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // 实现抽象方法,计算圆的面积
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    // 重写具体方法,返回圆的名称
    public String getShapeName() {
        return "圆";
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 实现抽象方法,计算矩形的面积
    public double calculateArea() {
        return width * height;
    }

    // 重写具体方法,返回矩形的名称
    public String getShapeName() {
        return "矩形";
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(3.0);
        Rectangle rectangle = new Rectangle(4.0, 5.0);

        circle.printInfo();
        rectangle.printInfo();
    }
}

好了,抽象类内容暂时就这些,拜拜各位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习|Leetcode189轮转数组 ,Leetcode56合并区间,Leetcode21合并两个有序链表,Leetcode2两数相加,sql总结

目录 一、Leetcode189轮转数组题目描述解题思路方法:切片总结 二、Leetcode56合并区间题目描述解题思路方法:总结 三、Leetcode21合并两个有序链表题目描述解题思路方法:总结 四、Leetcode2两数相加题目描述解题思路方法:总结 sql总结: 一、Leetcode189轮转数组 题目描述 给定…

【GIS教程】ArcGIS做日照分析(附练习数据下载)

我国对住宅日照标准的规定是:冬至日住宅底层日照不少于1小时或大寒日住宅层日照不少于2小时(通常以当地冬至日正午12时的太阳高度角作为依据)。因冬至日太阳高度角最低,照射范围最小,如果冬至日12:00建筑物底层能够接收到阳光,那么…

Go语言中通过数据对齐降低内存消耗和提升性能

数据对齐是一种安排数据分配方式以加速 CPU 访问内存的方法。 不了解这个概念会导致额外的内存消耗甚至性能下降。 要了解数据对齐的工作原理,让我们首先讨论没有它会发生什么。假设我们分配两个变量,一个 int32 类型的 (32 B) 和…

OJ:数字三角形(搜索)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 🌷1.问题描述: ⛳️题目描述: 示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章,指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识,这节只是简单了解一下指针,并不会深…

使用HTML和CSS和PHP实现一个简单的简历制作项目

实 验 目 的 掌握HTML表单作用,以及action和method属性; 掌握HTML输入域作用、类型、标签,以及name和value属性; 掌握$_REQUEST变量的作用、语法和使用; 掌握注释,以及变量的作用、命名、赋值和输出&#…

SpringBoot项目错误:找不到主类(解决办法)

清理和重新编译项目即可,在项目中点击右键Maven-Reload project,之后再重新运行就行了

MySQL、Oracle查看最大连接数和当前连接数

文章目录 1. MySQL2. Oracle 1. MySQL -- 查看最大连接数 show variables like max_connections; select max_connections; -- select * from performance_schema.session_variables where VARIABLE_NAME in (max_connections); -- select * from performance_schema.global…

SpringCloud 基础配置

1.SpringCloud配置 目前是2024了,笔者也是开始学习SpringCloud 下面是给大家总结的微服务需要的各种依赖的版本 首先我们说一个重点强调 约定 > 配置 > 编码 千万不要一把梭,上来就是干代码,千万记得配置一定得对 2.微服务工程Base构建 首先我们创建父工程 创建出来直接把…

嵌入式Linux开发

(17 封私信 / 1 条消息) 嵌入式Linux应用 - 搜索结果 - 知乎 (zhihu.com)

37. UE5 RPG创建自定义的Ability Task

在前面的文章中,我们实现了一个火球术的一些基本功能,火球术技能的释放,在技能释放后,播放释放动画,在动画播放到需要释放火球术的位置时,将触发动画通知,在动画通知中触发标签事件,…

课时100:正则表达式_基础实践_基础知识

3.1.1 基础知识 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 需求 我们之前的一些操作,很大程度上都是基于特定的关键字来进行实践的,尤其是面对一些灵活的场景,我们因为过于限定一些关键字&am…

线性代数基础2矩阵

矩阵是什么 矩阵就是二维数组,下面是一个 m 乘 n 的矩阵,它有 m 行,n 列,每行每列上面都有元素,每个元素都有行标i 和列标 j, a ij 。简称m n矩阵,记作: 注意a11的索引是 A[0,0]。…

多模态视觉语言模型:BLIP和BLIP2

1. BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP的总体结构如下所示,主要包括三部分: 单模态编码器(Image encoder/Text encoder):分别进…

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件,包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术,以准确预测时空数据,但重要的是要注意…

卷王问卷考试系统/SurveyKing调查系统源码

SurveyKing是一个功能强大的开源调查问卷和考试系统,它能够快速部署并适用于各个行业。 这个系统提供了在线表单设计、数据收集、统计和分析等功能,支持20多种题型,提供多种创建问卷的方式和设置。 项 目 地 址 : runruncode.c…

[阅读笔记16][Orca-2]Teaching Small Language Models How to Reason

接下来是Orca-2,这篇是微软在23年11月发表的论文,在Orca-1的基础上又进行了一些改进。 作者希望教会Orca-2各种推理策略,例如逐步思考、回忆然后回答、先回忆再推理再回答、直接生成回答等等策略。并且Orca-2应该能针对不同任务应该使用最合适…

安装Zipkin

官网:https://zipkin.io/pages/quickstart.html Jar包方式 下载 方式一:百度网盘下载 链接:https://pan.baidu.com/s/1PRV1RamJ8IWX32IJb7jw3Q?pwde8vu 提取码:e8vu 方式二:Central Repository: io/zipkin/zipk…

linux离线安装mysql

一、下载mysql 地址:MySQL 这里选择64为还是32为要根据操作系统来 uname -m 二、上传解压配置mysql 使用root账户登录linux服务器,在opt文件下创建mysql文件夹 cd /opt sudo mkdir mysql 使用Xftp上传mysql压缩包到此文件夹下(自行决定路径) cd mysql/…

李宏毅2022机器学习/深度学习 个人笔记(2)

本系列用于推导、记录该系列视频中本人不熟悉、或认为有价值的知识点 本篇记录第一讲(选修):神奇宝贝分类(续) 如图,boundary变为直线,结果也有上升 我们不一定采用高斯几率模型,…