13. 抽象类(abstract关键字)

抽象类

  • 抽象类
    • 1. 抽象类
      • 1.1 定义格式
      • 1.2 特点
    • 2. 抽象方法
      • 2.1 定义格式
      • 2.2 特点
    • 3. `abstract`关键字

抽象类

抽象类是在面向对象编程中,一种特殊的类,它不能被实例化,只能作为其他类的基类来使用。

抽象类和普通类的主要区别在于它包含一个或多个抽象方法。

1. 抽象类

抽象类是面向对象编程中的一个概念,它是一种特殊的类,不能被实例化,只能被用作其他类的基类来继承并实现其抽象方法。

1.1 定义格式

定义格式:

abstract class 类名字 { }

代码举例:

public abstract class Animal {public abstract void run()}

抽象类的定义包括:

  1. 抽象类通过关键字 abstract 进行声明。

  2. 抽象类可以包含抽象方法和具体方法。

  3. 抽象方法是一种只有声明而没有实现的方法,需要被子类重写来实现具体的逻辑。

  4. 抽象类可以包含成员变量和成员方法,这些成员变量和成员方法可以被子类继承。

注意:抽象类不一定有抽象方法,但是有抽象方法的类必须定义成抽象类。

示例:

abstract class Shape {protected String color; // 颜色属性public Shape(String color) {this.color = color;}public abstract void draw(); // 抽象方法,用于绘制形状public void setColor(String color) {this.color = color;}
}class Circle extends Shape {private double radius; // 半径属性public Circle(String color, double radius) {super(color);this.radius = radius;}@Overridepublic void draw() {System.out.println("Drawing a circle with radius " + radius + " and color " + color); // 绘制圆形}
}class Rectangle extends Shape {private double width; // 宽度属性private double height; // 高度属性public Rectangle(String color, double width, double height) {super(color);this.width = width;this.height = height;}@Overridepublic void draw() {System.out.println("Drawing a rectangle with width " + width + ", height " + height + " and color " + color); // 绘制矩形}
}public class Main {public static void main(String[] args) {Shape circle = new Circle("Red", 5.0); // 创建一个红色的半径为5的圆形对象circle.draw();Shape rectangle = new Rectangle("Blue", 3.0, 4.0); // 创建一个蓝色的宽度为3,高度为4的矩形对象rectangle.draw();}
}

在上述示例中,Shape 是一个抽象类,它包含一个抽象方法 draw(),并具有一个成员变量 color 和一个具体方法 setColor()CircleRectangle 都是 Shape 的子类,它们都必须实现抽象方法 draw()。在 Main 类中,我们可以创建 CircleRectangle 的对象,并调用它们的 draw() 方法来进行绘制。由于抽象类不能被实例化,我们只能创建其子类的实例,并通过多态性来使用抽象类。

1.2 特点

抽象类(Abstract Class)是一种特殊的类,它不能被实例化,只能被继承。

它主要的特点包括:

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

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

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

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

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

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

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

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

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

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

  6. 抽象类不能用 final 声明。

    理解:因为抽象类必须被子类继承。

  7. 非抽象方法包含方法体,可以直接使用或重写(Override)。

    理解:抽象类中可以包含非抽象方法,这些方法拥有方法体,可以直接调用使用。同时,子类也可以通过继承抽象类来继承这些非抽象方法,并且可以在子类中重写这些方法,从而实现子类对象对这些方法的调用。

    抽象类主要的作用是用来设计和组织一个类的具体子类,它定义了一个抽象的概念,而不是一个具体的实现。当需要实现该概念时,可以继承抽象类并实现它的抽象方法。

2. 抽象方法

抽象方法是在抽象类中声明但没有具体实现的方法。

它只有方法签名,没有方法体。抽象类中可以包含一个或多个抽象方法。

抽象方法通过使用关键字 abstract 来声明,在方法签名中只指定方法的名称、参数列表和返回类型,不包含具体的方法实现。具体的方法实现由继承抽象类的子类来提供。

2.1 定义格式

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

定义格式:

修饰符 abstract 返回值类型 方法名 (参数列表)

例如:

public abstract void run()

2.2 特点

抽象方法的主要特点包括:

  • 抽象方法没有具体的实现,继承抽象类的子类必须实现这些抽象方法,并提供具体的实现逻辑。

  • 抽象方法不能被声明为 private,final,static 或 strictfp,因为这些关键字会和抽象方法的特性相冲突。

下面是一个示例,展示了一个抽象类 Animal 和它的子类 Cat 和 Dog 的使用:

abstract class Animal {public abstract void makeSound();  // 抽象方法,动物发出声音public void sleep() {System.out.println("Animal is sleeping");  // 非抽象方法,动物睡觉}
}class Cat extends Animal {public void makeSound() {System.out.println("Meow");  // 实现抽象方法,猫发出声音}
}class Dog extends Animal {public void makeSound() {System.out.println("Woof");  // 实现抽象方法,狗发出声音}
}public class Main {public static void main(String[] args) {Cat cat = new Cat();cat.makeSound();  // 输出 "Meow"cat.sleep();  // 输出 "Animal is sleeping"Dog dog = new Dog();dog.makeSound();  // 输出 "Woof"dog.sleep();  // 输出 "Animal is sleeping"}
}

在上面的例子中,Animal 抽象类声明了一个抽象方法 makeSound(),所有继承 Animal 抽象类的子类都必须实现 makeSound() 方法。在 Cat 子类和 Dog 子类中分别实现了 makeSound() 方法,提供了具体的猫和狗发出声音的逻辑。通过创建 Cat 和 Dog 对象来调用 makeSound() 方法来输出相应的声音。抽象类 Animal 中的 sleep() 方法不是抽象方法,它有具体的实现。

3. abstract关键字

  1. 抽象类 (Abstract Class) :使用 abstract 关键字声明的类就是抽象类,它不能被实例化,只能被继承。

    声明抽象类:

    abstract class ClassName {// 抽象类的成员
    }
    
    • 使用 abstract 关键字来修饰类名,表示该类是一个抽象类。

    • 抽象类可以包含成员变量、非抽象方法和抽象方法。

  2. 抽象方法 (Abstract Method) :使用 abstract 关键字声明的方法就是抽象方法,它只有方法头(签名),没有方法体。

    声明抽象方法:

    abstract returnType methodName(parameters);
    
    • 使用 abstract 关键字来修饰方法,表示该方法是一个抽象方法。

    • 在方法的声明中只有方法的返回类型、方法名和参数列表,没有方法体(即没有具体的实现)。

    • 抽象方法必须被声明在抽象类中。

注意】:

  • 对于抽象类来说,它可以包含非抽象方法和抽象方法,但一个类只有包含至少一个抽象方法时才需要被声明为抽象类。

  • 对于抽象方法来说,它不能被声明为 private 或 final,因为私有方法无法被继承和重写,而 final 方法无法被重写。

  • 抽象类和抽象方法都不能被实例化或直接调用,抽象类只能被继承。

  • 抽象方法只有方法头,没有方法体。抽象方法相当于一个约定,必须在子类中实现具体的方法体。

  • 如果一个类继承了抽象类,那么它必须实现抽象类中的所有抽象方法,除非它自己也是抽象类。

  • 如果一个子类继承了抽象类,可以选择性地重写非抽象方法。

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

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

相关文章

Harbor离线安装

下载安装包 $ wget https://github.com/goharbor/harbor/releases/download/v2.7.4/harbor-offline-installer-v2.7.4.tgz解压 $ tar xvf harbor-offline-installer-v2.7.4.tgz -C /usr/local修改配置 $ cd /usr/local/harbor $ cp harbor.yml.tmpl harbor.yml $ vim harbo…

sqlserver导出数据为excel再导入到另一个数据库

要将SQL Server中的数据导出为Excel文件,然后再将该Excel文件导入到另一个数据库中,你可以按照以下步骤进行操作: 导出数据为Excel文件 echo offset SourceServer源服务器名称 set SourceDB数据库名称 set ExcelFilePath导出到的Excel文件路…

二叉树的遍历(递归法)

递归的三要素: ①确定递归函数的参数和返回值 ②确定终止条件 ③确定单层递归的逻辑 以前序遍历为例: 1、确定递归函数的参数和返回值: 参数中需要传入list来存放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返…

【文献解读】“MOBILEViT:轻量级、通用目的、移动友好的视觉变换器”。

今天阅读这篇2022年ICLR会议上发表的论文,主要是为了学习MobileViT模型,用于YOLO模型主干改造。 一、文献概述 作者:Sachin Mehta 和 Mohammad Rastegari。地点:作者所属机构是 Apple。内容简述: 提出了一种名为Mob…

手把手Docker部署Gitblit服务器

1拉取镜像 docker pull jacekkow/gitblit:v1.9.1 2.启动 docker run -d --name gitblit --restart always -p 10006:8080 -p 18443:8443 -p 19418:9418 -p 29418:29418 -v /data/gitblit/data:/opt/gitblit-data jacekkow/gitblit:v1.9.1 3.查看 默认账户/密码:admin/adm…

我的技术栈

.NET、.NET Core、C#11、Entity Framework、ASP.NET MVC、Linq、Lambda、Dapper、 Web Service、WCF、Web API、SOAP、HTTP、XML、JSON、RESTful、Protocol Buffers、 U3D、IOC、AOP、 SOAPRPCHTTPXML TCP/IP和UDP Web服务器:Nginx、IIS、Tomcat、Apache、 开发框架…

安卓手机变iOS!

Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器,可以将安卓手机桌面变成iOS样子,还有iOS的开机动画和景深效果! 下载链接:【Launcher iOS 16】 ​

腾讯云优惠券介绍、种类、领取入口及使用教程

腾讯云作为国内领先的云服务提供商,为广大的企业和开发者提供了优质的云计算、大数据、人工智能等服务。为了更好地吸引用户,腾讯云推出了多种优惠活动,其中就包括腾讯云优惠券。本文将详细介绍腾讯云的优惠券种类、领取入口以及使用教程。 一…

第 4 章 链表

文章目录 4.1 链表(Linked List)介绍4.2 单链表的应用实例4.3 单链表面试题(新浪、百度、腾讯)4.4 双向链表应用实例4.4.1 双向链表的操作分析和实现4.4.2 课堂作业和思路提示 4.5 单向环形链表应用场景4.6 单向环形链表介绍4.7 Josephu 问题4.8 Josephu 问题的代码实现 4.1 链…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 内存管理基本了解

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 移步飞书获得更好阅读体验: Docs Hello,大家好我是硬核王同学,是一名刚刚工作一年…

ubuntu22.04 virt-manager bridge虚拟机ip 一样

virt-manager bridge 全部虚拟机ip都一样解决办法 ubuntu22.04 virt-manager 创建 ubuntu20.04 live-server 虚拟机,创建好后,使用bridge网络,正常运行。 clone虚拟机启动后,发现虚拟机的ip都一样,重启无效。 解决办…

习题5-1 代码对齐(Alignment of Code, ACM/ICPC NEERC 2010, UVa1593)

输入若干行代码,要求各列单词的左边界对齐且尽量靠左。单词之间至少要空一格。每个单词不超过80个字符,每行不超过180个字符,一共最多1000行,样例输入与输出如图所示。 //代码对齐 //思路:统计每列最长的单词 不够长…

LeetCode 0083.删除排序链表中的重复元素:模拟

【LetMeFly】83.删除排序链表中的重复元素:模拟 力扣题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的…

docker-compose部署kafka、SASL模式(密码校验模式)

一.基础kafka部署 zookeeper,kafka,kafka-ui docker-compose.yml 注意点:192.168.1.20 是宿主机的ip version: "3" services:zookeeper:image: wurstmeister/zookeepercontainer_name: zookeeperrestart: alwaysports:- 2181:2…

Java判断字符串当中是否有中文符号(不是中文名称,是符号)

public static void main(String[] args) throws ParseException, IOException, URISyntaxException {// 测试示例String testString1 "Hello,test!";String testString2 "This is a test.";boolean result1 containsChineseSymbols(testStr…

JavaSE-Java基础-笔记

1.二进制 1)它包含0、1两个数,逢二进一 如:1->1 2->10 ...) 2)每一个0或者每一个1,叫做一个bit(比特) 2.二进制与十进制转换 十进制数据转成二进制数据:使用除以2获取余数的方式 如…

第一次开发基于SpringBoot的Java应用

第一次开发基于SpringBoot的Java应用 一、 方式1:IDEA创建New Project Spring Boot官方文档的Getting Started1、IDEA创建New Project2、Spring Boot官方文档的Getting Started2.1 Creating the POM (实际是,更新pom.xml)2.2 Add…

【GitHub项目推荐--学算法】【转载】

不想做低级码农,不想成为前端抠图达人或是后台「增删改查」小王子?那你可能需要好好复习下算法与数据结构。 想成为算法工程师,基础知识是绕不开的大山。这次要推荐的项目是数据结构与算法的开源项目集,覆盖多种主流语言&#xff…

word表格一拖动就往顶部跑而且还拖不下来了以及在表格前增加文字的解决方案

一、word表格一拖动就往顶部跑而且还拖不下来解决方案: 这个表格属性设置问题,解决方法如下: 1、将需要设置的文档打开,在文档里面选中表格,单击鼠标点击表格属性进入。 2、进入表格属性界面之后,在表格…

呼吸道病毒感染后,为何会引发细菌性肺炎?气道和肠道微生物组改变是关键

谷禾健康 病毒-细菌合并或继发感染 引起呼吸道感染的病毒是导致全世界高发病率和死亡率的原因,数十年来通常发生在冬季。在冬天,空气干燥,那些可能含有病毒的飞沫可以在空气中停留更长时间,并可以进一步传播。此外人的免疫力在冬季…