Java 抽象类 详解

文章目录

  • 一、概述
    • 1.1、什么是抽象类
    • 1.2、定义抽象类
    • 1.3、什么是抽象方法
    • 1.4、定义抽象方法
  • 二、特点
    • 2.1、抽象类的特点
      • 2.1.1、抽象类不可以实例化对象
      • 2.1.2、抽象类必须要被继承
      • 2.1.3、抽象类的子类
      • 2.1.4、抽象类的成员
    • 2.2、抽象方法的特点
      • 2.2.1、只能有方法声明,不能有方法体
      • 2.2.2、抽象方法只存在于抽象类当中
      • 2.2.3、抽象方法必须要能够被继承
      • 2.2.4、其子类必须要重写抽象方法
  • 三、应用
  • 四、总结

一、概述

1.1、什么是抽象类

    在Java中使用最多的就是类,类用于抽象一类事物,是将现实世界的事物通过抽象的方式给描述成为一个类,该类具有这一类事物的属性和行为,通过new关键字可以实例化类,在程序世界中按照类的描述创建一个对象。而当一个类提供的信息不足以实例化一个具体的对象时,或者说当前类的行为不符合具体对象的行为时,我们是不会将当前类实例化对象的,这种类一般被定义为抽象类。举个例子:定义一个宠物类,其中定义成员属性:姓名、年龄、毛色,定义成员行为:吃饭,睡觉等,这个时候我们看宠物类,宠物宠物,是哪一种动物?有点指代不清,并且不同的宠物吃的东西不一样,宠物狗吃狗粮,宠物猫吃猫粮,也就是说宠物类提供的信息不足以描述一个具体的对象,因此我们不会实例化宠物类这个对象,而是将其设置为抽象类。
    
    简而言之,言而简之,当一个类内部定义的成员变量成员方法不足以描述一个具体的对象时,便将该类定义为抽象类

1.2、定义抽象类

    在Java中,如果被abstract关键字修饰一个类,那么当前类被称之为抽象类

访问修饰符   abstract   class   类名{     }

1.3、什么是抽象方法

    宠物类不是一个具体的动物,那么其内部的eat()方法就无法具体实现,具体的eat()方法只有子类具体的动物对象才可以实现。像这种无法定义具体实现内容的方法我们可以将其设置为抽象方法。

1.4、定义抽象方法

    被abstract关键字修饰方法,那么当前方法被称之为抽象方法,抽象方法不需要写方法体,只有方法声明,没有具体的方法实现,没有{ }。

访问修饰符  abstract  返回类型  方法名(参数列表);
public abstract class Animal {//当前Animal类为抽象类public abstract void eat();//eat()方法为抽象方法public abstract void fly();//fly()方法为抽象方法
}

二、特点

2.1、抽象类的特点

2.1.1、抽象类不可以实例化对象

    本身就是因为当前类提供的信息不足以描述一个具体的类才将当前类设置为抽象类的,而又将抽象类进行实例化对象,那么得到的结果将得不偿失,抽象类不支持实例化对象,也就是不可以通过new关键字实例化对象。

在这里插入图片描述
实例化Animal抽象类,编译直接爆红。

2.1.2、抽象类必须要被继承

    抽象类存在的意义本身就是为了被继承,抽象类没有被继承本身抽象类又不可以实例化对象,那么定义当前抽象类来干什么?

2.1.3、抽象类的子类

    抽象类的子类必须要重写抽象类当中的全部抽象方法,否则一直爆红,即抽象类当中只要是被abstract关键字修饰的方法都被强制重写。

在这里插入图片描述

    有一种方法可以让子类不用重写父类抽象类当中的抽象方法,就是将子类也定义为抽象类,这样当前情况就是抽象类继承抽象类无需重写抽象方法,但是最终还是逃不过重写抽象方法的,该来的还是会来跑不掉的,即便子类是抽象类,那么只要是抽象类结果都是被继承,那么子类抽象类的子类还是要重写抽象方法,而且还是重写父类和父类的父类两个类的抽象方法

在这里插入图片描述

    这也就意味着抽象类的子类可以有两种选择:
1、子类也定义为抽象类
2、子类不是抽象类
不过最终的结果还是继承普通类,即便子类是抽象类也2逃不过被继承的命运最终还是要重写全部都抽象方法

2.1.4、抽象类的成员

    抽象类和普通类基本一致,普通类有的抽象类都有,抽象类当中可以定义成员变量,构造器(同样支持重载),普通成员方法,抽象方法。
    
    唯一和普通类不同的就是:普通类不可以定义抽象方法,抽象类可以定义抽象方法。

public abstract class Animal {//当前Animal类为抽象类protected String name;protected int age;protected String color;public Animal() {}public Animal(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}public void love() {System.out.println(name + "爱主人");}public abstract void eat();//eat()方法为抽象方法public abstract void fly();//fly()方法为抽象方法
}

2.2、抽象方法的特点

2.2.1、只能有方法声明,不能有方法体

    当方法被abstract关键字修饰时,当前方法就是抽象方法,那么当前方法就不能够有具体的实现细节,将方法头编写完整后直接加上“;”,不可以加{ },否则系统会爆红。

在这里插入图片描述

    当方法被关键字abstract修饰时,该方法注定了要被子类重写,因此当前方法没必要再编写具体的实现细节了,语法也不支持编写方法体。

2.2.2、抽象方法只存在于抽象类当中

    抽象类当中可以不包含抽象方法,但是抽象方法必须存在于抽象类当中,这也就意味着:抽象方法不能存在普通类中

在这里插入图片描述

    Dog类是普通类,在Dog类当中编写抽象类,语法不支持,结果就是系统爆红

2.2.3、抽象方法必须要能够被继承

    抽象类存在的意义就是被继承,抽象方法的存在就是被重写,那么抽象方法必须要满足重写的条件,这也就意味着抽象方法不能够被:static关键字,final关键字,private关键字修饰,被这三个关键字修饰的方法都不支持重写

在这里插入图片描述

    也就是说:abstract关键字和static关键字,final关键字,private关键字不能共存,就像是this()和super()不能同时出现一样。

2.2.4、其子类必须要重写抽象方法

    抽象方法存在的意义就是被重写,当子类继承抽象类,如果子类不重写抽象方法,那定义抽象方法有何意义,因此语法要求:其子类(非抽象类)必须重写父类抽象类的抽象方法,否则编译不通过。

在这里插入图片描述

三、应用

public abstract class Animal {//当前Animal类为抽象类protected String name;public Animal(String name) {this.name = name;}public void love() {System.out.println(name + "爱主人");}public abstract void eat();
}class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void eat() {System.out.println(name + "吃狗粮....");}
}class Cat extends Animal {public Cat(String name) {super(name);}@Overridepublic void eat() {System.out.println(name + "吃猫粮....");}
}

在这里插入图片描述

四、总结

    可能会有人说:普通的类也可以定义普通方法,然后其继承的子类也可以重写这些普通方法啊,那这样子抽象类有什么意义?定义成为抽象类然后子类一定要重写抽象方法和子类重写普通父类的普通方法有什么区别吗?这不是脱裤子放屁多此一举吗?
    
    事实上使用抽象类相当于多了一层编译器的校验,在很多时候,实际的工作不应该由父类来完成,而应该由子类来完成,父类本身的作用就是实现共性的抽取,实现代码的复用,而且大多数情况下父类所提供的信息都是不足以描述一个具体的对象的。那么此时我们一不小心误用了父类,使用普通方法是不会报错的,但是使用抽象类,当父类实例化的时候会提示错误,让我们尽早的发现并解决问题。这也就意味着抽象类本质上是一种预防出错的机制。

    很多语法存在的意义都是为了“预防出错”例如我们曾经使用fianl关键字,当我们定义变量后,不再对该变量进行更改时,该变量不就相当于是常量吗?但我们使用final关键字时就多了一层预防机制,当我们不小心对该变量进行了修改,编译器就会及时的提醒我们,让我们及时修改错误,避免出现不必要的麻烦。

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

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

相关文章

A20红色革命文物征集管理系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

SpringBoot Java教学工具:创新教育体验

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理教学辅助平台的相关信息成为必然。开发合适…

VisionPro —— CogIPOneImgeTool工具详解

CogIPOneImageTool工具主要用来对单张图像进行算法处理操作 CogIPOneImgeTool简介 CogIPOneImageTool 工具可完成高斯平滑、高通滤波和图像量化等基本图像处理操作。Image Processing One Image 工具编辑控件为此工具提供图形用户界面。 Image Processing Operations (图像处…

WPF+MVVM案例实战与特效(二十四)- 粒子字体效果实现

文章目录 1、案例效果2、案例实现1、文件创建2.代码实现3、界面与功能代码3、总结1、案例效果 提示:这里可以添加本文要记录的大概内容: 2、案例实现 1、文件创建 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 ParticleWindow.xaml,在 Models 文件夹下创建粒子…

推荐一款功能强大的FTP和云应用程序:FTPie Pro

FTPie Pro是一款集多种云存储和 FTP 客户端功能于一体的先进文件管理工具。通过支持Google Drive、Dropbox和OneDrive等主流云存储服务,用户可以在一个平台上高效管理文件。同时,它兼容 FTP、FTPS 和 SFTP 等多种文件传输协议,确保文件传输的…

playwright学习记录1

playwright 简介:Playwright 是由微软推出的一款用于 Web 应用自动化测试的开源框架,它支持多浏览器、多平台,具有强大的 API 和现代化的自动化功能,适用于跨浏览器的 UI 测试。Playwright 支持所有现代渲染引擎,包括…

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 【…

数据结构进阶——AVL树

一、AVL树基本概念 1.1定义 如果一颗二叉搜索树的左右子树的高度差的绝对值不超过1(1,0,-1),那么这颗二叉搜索树就叫AVL树。 1.2AVL树的性质 AVL树的左右子树也是一颗AVL树,二叉搜索树是一颗高度平衡的二叉…

Easyconnect官网下载安装使用教程

软件下载 打开官网https://www.sangfor.com/downloads; 选择自己熟悉的语言 windows选择支持与服务—软件下载 mac 找售后智能在线(见下面MAC) 在所有产品与服务中选择:SSL VPN 左侧选择SSL VPN工具,然后根据自…

从神经元到神经网络:深度学习的进化之旅

神经元、神经网络 神经元 Neuron ),又名感知机( Perceptron ),在模型结构上与 逻辑回归 一致,这里以一个二维输入量的例子对其进行进一步 的解释: 假设模型的输 入向 量是一 维特征向 (x1,x2). 则单神 经元的模型结构 如下…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

Odoo:免费开源的医药流通行业信息化解决方案

文 / 开源智造Odoo亚太金牌服务 方案概述 开源智造Odoo免费开源ERP提供面向医药批发采、供、销业财一体化,及直接面向消费者的门店终端、全渠道管理、营销管理以及GSP合规管理解决方案,提升企业运营效率和全业务链条的数字化管控、追溯能力。 行业的最新…

牛客sql题目总结(1)

1.第N高的薪水 AC: create function getnthhighestsalary(n int) returns int begindeclare m int; set m n - 1; return (select distinct salaryfrom employeeorder by salary desclimit m, 1); end 2.平均播放进度大于60%的视频类别 AC: select tb_video_info…

数量少的连锁店要不要用智能巡检?

无论是在新闻报道中,还是企业定制目标客户时,人们都更喜欢聚焦原本就已经站在各行业金字塔尖的那 1%,剩下的 99% 却常常被忽略。 比如此刻我正在搜索中小型连锁企业智能巡检相关的资讯,但网页展示的结果基本围绕着「中大型、1000门…

windows 进程降权和提权代码示例(2)

强制完整性控制 - Win32 应用程序 |Microsoft 学习 一、强制完整性控制 品03/26/20217 个参与者 反馈 本文内容 诚信标签进程创建强制性政策 强制完整性控制 (MIC) 提供了一种用于控制对安全对象的访问的机制。此机制是对自主访问控制的补充&#xff…

Redis - Set 集合

一、基本了解 集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中1)元素之间是⽆序 的2)元素不允许重复,如图2-24所⽰。⼀个集合中最多可以存储 32 2 − 1 个元素。Redis除了⽀持 集合内的增删查改…

Java教学辅助:SpringBoot平台实战技巧

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

Codeforces Round 970(Div. 3) (预处理后缀, 一道适合py的题)

F. Sakurakos Box 传送门:Problem - 2008F - Codeforces Sakurako has a box with nn balls. Each ball has its value. She wants to bet with her friend that if the friend randomly picks two balls from the box (it could be two distinct balls, but they…

OpenDroneMap Webodm

OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…

Github 2024-11-02 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目2Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Genera…