【从零开始学习JAVA | 第十七篇】抽象类与抽象方法

news2025/1/14 9:37:32

目录

 前言:

抽象类与抽象方法:

抽象类:

抽象方法:

特点:

抽象类

抽象方法

注意事项

抽象类 与 抽象方法的意义

抽象类

抽象方法


 前言:

        在之前,如果我们要构建两个相同类型的类的时候,减少代码的重用率,我们想出了一个方法:抽象出来一个父类,父类有两个子类相同的性质,我们在创建子类的时候,就可以继承这个父类,然后再在子类中添加不同的类内成员。这种方法很好,但是还有一个问题:我们其实也可以单独创建出来这个父类person,并且我们之前在父类中创建的供子类重写的代码也可以被直接调用。这在逻辑上就有一定的问题,因此我们提出了抽象类与抽象方法的概念。

抽象类与抽象方法:

抽象类:

1. 抽象类是一种特殊的类,无法被实例化

2. 抽象类中可以定义抽象方法,抽象方法只有方法签名,没有方法体,需要使用 `abstract` 关键字来修饰。

3. 抽象类可以包含普通的具体方法或属性,但是至少必须有一个抽象方法

4. 如果一个类继承了一个抽象类,那么它必须实现这个抽象类中所有的抽象方法,否则这个类也必须被声明为抽象类。

下面是一个抽象类的例子:

abstract class Shape {
    protected int x, y;

    public void moveTo(int newX, int newY) {
        System.out.println("移动到 (" + newX + "," + newY + ")");
        x = newX;
        y = newY;
    }

    abstract public double area();
}

class Rectangle extends Shape {
    private int width, height;

    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    public double area() {
        return width * height;
    }
}

class Circle extends Shape {
    private int radius;

    public Circle(int x, int y, int radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    public double area() {
        return Math.PI * radius * radius;
    }
}

在上面的例子中,Shape 是一个抽象类,包含了一个普通方法 moveTo 和一个抽象方法 area。Rectangle 和 Circle 分别继承自 Shape 类,并实现了 area 方法。

抽象方法:

1. 抽象方法没有方法体,只有方法签名,需要使用 `abstract` 关键字来修饰。

2. 抽象方法必须在抽象类中定义。

3. 所有的抽象方法都必须在子类中被实现。

下面是一个抽象方法的例子:


abstract class Animal {
    abstract public void sound();
}

class Dog extends Animal {
    public void sound() {
        System.out.println("Woof");
    }
}

class Cat extends Animal {
    public void sound() {
        System.out.println("Meow");
    }
}

在上面的例子中,Animal 是一个抽象类,包含了一个抽象方法 sound。Dog 和 Cat 分别继承自 Animal 类,并实现了 sound 方法。

通过上述代码可以看出,抽象类和抽象方法的使用可以帮助实现代码的灵活性和可扩展性,通过继承抽象类,并实现抽象方法,可以使类的设计更加合理且易于扩展。

特点:

抽象类

1. 抽象类不能被实例化

由于抽象类包含抽象方法,而抽象方法没有方法体,因此无法完成一个抽象类的实例化。

2. 抽象类可以包含已实现的方法

抽象类中有可能存在已实现的方法,在子类继承时可以直接使用这个方法。

3. 抽象类中必须至少包含一个抽象方法

抽象类中至少需要存在一个抽象方法,抽象方法某种程度上反映出了这个类完整功能的一部分。

4. 抽象类的子类必须实现所有抽象方法

如果一个类继承了一个含有抽象方法的抽象类,它必须实现所有抽象方法,否则这个类也必须被声明为抽象类。

抽象方法

1. 抽象方法没有方法体

抽象方法只有方法签名,没有具体的实现。

2. 抽象方法必须在抽象类中定义

因为抽象方法只有方法签名,没有方法体,所以抽象方法必须在抽象类中定义,而普通的类无法定义抽象方法。

3. 所有的抽象方法都必须在子类中被实现

如果一个子类继承了一个抽象类,并且这个抽象类中存在抽象方法,那么子类必须实现所有抽象方法。

4. 抽象方法必须符合方法重写的规则

当子类继承了一个抽象类,并且实现了这个抽象类的抽象方法时,实现的方法必须与抽象方法具有相同的签名,权限修饰符和返回类型。

注意事项

1. 一个类可以同时继承一个抽象类并实现多个接口

2. 抽象类和接口都可以规定子类必须实现某种行为

3. 抽象类适用于多个子类需要实现相同的行为的情况,接口适用于多个类需要实现相同的方法的情况

4. 对于一个应用程序,应该尽量避免使用过多的抽象类。在OOP中,不应该过度使用继承,因为它会导致类之间的耦合,从而使代码难以维护。为了解决这个问题,可以使用接口替代抽象类,接口可以实现灵活的组合方式,以及避免使用继承时存在的种种问题。

抽象类 与 抽象方法的意义

抽象类

1. 抽象类是一种约束和规范类的定义方式,它更加严谨和规范。

2. 抽象类通过抽象方法定义了一些行为或功能,强制子类对这些方法进行具体实现并覆盖实现细节。

3. 抽象类可以更加灵活地组织代码,从而在实现某些具体的操作时更加便捷。

4. 抽象类可以作为其他类的基类,可以减少代码量,降低耦合度。

抽象方法

1. 抽象方法是一种约束和规范方法的定义方式,它强制实现类实现方法的具体实现。

2. 抽象方法是一种规范和规则,强制子类实现必要的方法,从而保证程序的一致性和正确性。

3. 抽象方法可以让设计者将精力集中在类的接口上,而不用过早地考虑到具体实现的细节处理。

4. 抽象方法的使用可以降低耦合度,提高类的级别,从而方便代码的修改和维护。

总之,抽象类和抽象方法作为面向对象编程中的重要概念,可以帮助程序员更加准确地定义类和方法的特征,从而使代码更加规范、简洁和易维护。它们可以规范代码并减少出错几率,是一种对程序员的约束和规范,有助于提高程序的可读性和可维护性。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

【C++】泛型编程——模板进阶

文章目录 前言1. 模板参数的分类2. 非类型模板参数2.1 非类型模板参数的概念2.2 铺垫2.2 非类型模板参数的使用2.4 注意2.5 array的了解 3. 模板的特化3.1 概念3.2 函数模板特化3.3 类模板特化3.3.1 全特化3.3.2 偏特化部分特化参数更进一步的限制 4. 模板分离编译4.1 什么是分…

基于TF-IDF算法个人文件管理系统——机器学习+人工智能+神经网络(附Python工程全部源码)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 词频计算与数据处理3. 数据计算与对比验证 系统测试工程源代码下载其它资料下载 前言 本项目旨在通过应用TF-IDF算法,将新下载的课件进行自动分类整理。我们的方法是通过比较新文件中的…

Matlab统计分析-相关系数

统计分析-相关系数 相关系数 (pearson与spearman) 皮尔逊 person相关系数和斯皮尔曼spearman等级相关系数,它们可用来衡量两个变量之间的**(线性)**相关性的大小,根据数据满足的不同条件,我们要选择不同的相关系数进行计算和分析。 基础概…

C生万物 | 常见的六种动态内存错误

学习过C语言中的动态内存函数,例如【malloc】、【calloc】、【realloc】、【free】,那它们在使用的过程中会碰到哪些问题呢,本本文我们一起来探讨下~ 1、对NULL指针的解引用操作 代码: void test() {int *p (int *)malloc(INT_…

Sui链上事务处理概述

Sui通过其混合式交易处理方法,实现比其他区块链更快速和高效的性能。这种方法使得Sui的交易测试吞吐率达到每秒297,000次。从实际应用的角度来看,使用Sui的用户在apps和游戏中几乎能够获得实时响应。 在区块链世界中,交易是apps运作的基础&a…

AutoHotKey脚本的循环:While和Loop

While AHK提供三种循环方法,分别是Loop, While和For,其中While和For在其他语言中都很常见,下面通过while循环,实现一个鼠标框选矩形尺寸的脚本 ; 来自官网的案例 CoordMode "Mouse", "Screen"~LButton:: {M…

【文献分享】基于感知质量的滚动优化无人机导航

论文题目:Perception-aware Receding Horizon Navigation for MAVs 作者:Zhang, Zichao ; Scaramuzza, Davide 作者机构:苏黎世大学 论文链接:https://files.ifi.uzh.ch/rpg/website/rpg.ifi.uzh.ch/html/docs/ICRA18_Zhang.pd…

【雕爷学编程】Arduino动手做(122)---BH1750光照传感器

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

使用近10年,说说向大家推荐Linux系统的理由

使用linux已经快十年了,一直想推荐身边的使用linux,但是一直没有分享。但是现在我想分享推荐了。下面我们一起聊聊为什么我向大家推荐linux。 为什么现在我想推荐了呢?是因为我自认为相对于同龄人来说,我使用桌面版的时间算是挺长的了&#…

彻底搞懂什么是阿里云服务器vCPU?

阿里云ECS服务器vCPU和CPU是什么意思?CPU和vCPU有什么区别?一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定,CPU是中央处理器,一个CPU可以包含若干个物理核,通过超线程HT(Hyper-Threading&am…

走向计算机视觉的通用人工智能:从GPT和大型语言模型中汲取的经验教训 (下)...

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID|计算机视觉研究院 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…

Matlab预测模型-灰色预测模型

预测模型-灰色预测模型 灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立…

Linux学习[19]管线命令详解1---cut, grep, sort, wc, uniq

文章目录 1. 何为管线2. 摘取命令:cut, grep2.1 cut2.2 grep 3. 排序命令sort,wc,uniq3.1 sort3.2 uniq3.3 wc 总结 1. 何为管线 管线命令和Linux学习18里面的连续执行指令少许不同。他是只有在前面指令执行正确的时候,才会执行管线命令。 即这个管线命…

基于Vue+Node.js的宠物领养网站的设计与开发-计算机毕设 附源码 83352

基于VueNode.js的宠物领养网站的设计与开发 摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由…

彻底卸载mysql的详细步骤

目录 一、前言 二、操作步骤 (一) 停止mysql的服务 (二)控制面板卸载 (三)清除残留的文件 (四)删除注册表内容 (五)删除MySQL环境变量 一、前言 卸载…

spider-flow新手暴力入门

1.入口 链接跳转: spider-flow 或者本地有git软件直接输入gittt中的链接地址,回车键梭哈即可 2.环境部署,必备jdk8mysql idea打开项目,重点修改如下 mysql用小皮软件(phpstudy)自带的mysql5,navicat软件导入sql文…

SEO一般多久时间才会有效果?

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言什么是SEOSEO的时间…

Sui x KuCoin Labs夏季黑客松第二批入围项目公布

Sui x KuCoin Labs夏季黑客松仍在如火如荼地进行中。自第一批入围项目名单公布后一周,第二批入围项目现已经过审核,入围最终Demo Day。 第二批入围名单 Vimverse Vimverse是一个基于Sui构建的创新生态金融平台,旨在释放去中心化储备货币协…

计算物理专题:主值积分

计算物理专题:主值积分 吴式枢理论 主值积分 设在以及上可积,其中为任意小的正数,当两者独立地趋于零,极限存在。如果,这个极限存在,则称它为瑕积分的主值,记作无界函数的改造则该瑕积分的主值…

使用鲁棒优化的定价策略进行微电网不平衡管理研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…