【JavaSE】抽象类与接口

Object 类

类 java.lang.Object是类层次结构的根类,即所有类的父类。

  • 除Object类之外的任何一个Java类,全部直接或间接的继承于Object类。由此,Object类也被称为根父类。
  • Object类中声明的成员具有通用性,并且Object类中没有声明任何属性,只提供了一个空参的构造器。
  • 正是由于Object类的根父类这一特性,因此所有的类都可以重写Object类中的方法。

equals方法

定义

在Object类中equals()方法的源码如下:

 由源码可知,equals()方法判断两个对象是否相等,就是判断两个对象的引用地址是否相同(或者说是判断两个变量是否指向了堆空间中的同一个对象实体)。

对于自定义类来说,如果没有重写equals()方法,那么判断两个对象是否相等使用的就是Object类中的源码,如果重写了equals()方法,那么就是根据自己的自定义条件进行判断。

对于像String类、Date类和包装类等,他们都重写了Object类中的equals()方法,其方法内容就是用于比较两个对象实体的内容是否相同。

实际开发中,重写equals()方法,一般就是重写成判断两个对象的实体内容是否相等,而非两个对象的引用地址是否相等。

== 和 equals()的区别

==是一个运算符,既可以判断基本数据类型,也可以判断引用数据类型。判断基本数据类型时,就是判断其对应的数值是否相等;判断引用数据类型时,就是判断其引用地址是否相同,或者说是判断两个变量对应的是否是一个实体。

equals()是一个方法,因此只能判断引用数据类型。判断引用数据类型时,如果没有重写Object类中的equals()方法,那么作用就和运算符==的相同,判断两个变量是否指向了堆内存中的同一个对象实体。如果重写了equals()方法,那么具体的判断就是重写方法中的内容,不过一般重写的equals()方法就是用来判断两个变量对应对象的内容实体是否相同。

toString()方法

定义

在Object类中toString()方法的源码如下:

由源码可知,toString()方法是用来返回该类的地址值,不过由于Java是在JVM上运行,因此返回的并不说电脑上的实际地址,而是一个哈希值。

对于自定义类来说,如果没有重写toString()方法,那么输出的就是一个地址值。如果重写了toString()方法,那么输出的内容就是重写代码的执行结果。

对于像String类、Date类以及包装类中,都对toString()方法进行了重写。当调用toString()方法时,这些类返回的就是当前对象的实体内容。

实际开发中,一般自定义类重写toString()方法时,也是书写返回当前类的具体内容的代码.并且关于toString(),在调用对象名输出时,其实源码中调用的是toString()方法。

static

如果想让类的一个成员(除构造器外)被类的所有实例所共享,那么就使用关键字static来修饰这个成员。

类成员的设计思想

当我们编写一个类时,其实就是在描述一个类的属性和行为,而并没有产生实质上的对象,只有使用new关键字时才能产生出对象,这时系统才会分配内存给对象,对象中的方法和属性才可以供外部调用。我们有时候希望无论是否产生了对象或者无论产生了多少个对象,某些特定的数据在内存中有些仅有一份

这里的类成员,只需要使用static修饰即可,所以也被称为静态成员。

static可以修饰的结构

属性、方法、代码块、内部类。

静态变量 VS 实例变量

1. 个数

     静态变量:一定有且仅有一个,被类的多个对象所共性。

     实例变量:创建几个对象,实例变量就有几个。

2. 内存位置

     静态变量:存放在方法区。

     实例变量:存放在堆空间中。

3. 加载实际

     静态变量:随着类的加载而加载。由于类只会加载一次,因此静态变量也只会加载一次。

     实例变量:随着对象的创建而创建,每个对象都拥有自己的一个实例变量。

4. 调用者

     静态变量:可以被类调用,也可以被对象调用。

     实例变量:只能使用对象调用。

5. 消亡时机

     静态变量:随着类的卸载而消亡。

     实例变量:随着对象的消亡而消亡。

静态方法 / 类方法

1. 随着类的加载而加载。

2. 可以通过类名.静态方法名的方式进行调用。

3. 在静态方法内部,不可以调用非静态的属性和方法。但是对于非静态方法来说,内部是可以调用静态的属性和方法的,同时也可以调用非静态的属性和方法。

4. 在静态方法内部,并不可以使用super或者this关键字。

特别说明

对于静态方法的声明,当方法内部全部是静态的成员时,就可以将方法设为静态方法。在真实的开发场景中,一般将工具类的方法设置为静态方法。

对于静态属性的声明,如果属性的值是能被所有类所共享的,那么就可以设置为静态属性。在真实的开发场景中,一般将常量设置为静态的。

注意事项

Dog a = null;
dog.hello();
System.out.prntln(a.count);// 由于hello()方法和count属性都是静态的
// 因此使用上述方法时,并不会报错
// 相反还会正常输出结果

final

final理解

最终的

final可以用来修饰的结构

类、方法、变量(成员变量和局部变量)

具体说明

1. final用来修饰类,表示类不能被继承。

2. final用来修饰方法,表示方法不能被重写。

3. final修饰变量,表示变量成了常量,一旦赋值,不可修改。

        ①final修饰成员变量,可以显式赋值、代码块赋值以及构造器赋值(不能默认初始化赋值)。

        ②final修饰局部变量,一旦赋值,不可更改。对于方法内部声明的变量,在调用局部变量前,一定要进行赋值,而且一旦赋值,就不可更改。对于方法形参,在调用方法时,给形参进行赋值,而且一旦赋值,就不可更改。

final和static

final和static结合修饰属性时,此变量称为全局常量。

抽象类(abstract)

抽象类使用abstract来修饰。

由来

随着继承层次中一个个新子类的定义,子类变得越来越具体,而父类变得越来越一般,越通用。类的设计应该保证父类和子类共享特性。有时程序员将一个父类设计的非常抽象,以至于它没有具体的实例,这样的类叫作抽象类。

们声明一些几何图形类:圆、矩形、三角形类等,发现这些类都具有共同特征:求面积,求周长。那么这些共同特征应该抽取到一个共同父类:几何图形类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自具体实现。那么父类在声明这些方法时,就只有方法签名,没有方法体,我们把没有方法体的方法称为抽象方法。Java语法规定,包含抽象方法的类必须是抽象类。

abstract可以用来修饰的结构

类(外部类和内部类)、方法

具体说明

abstract修饰方法时,表示此方法为抽象方法。在抽象方法中,只有方法的声明,没有方法体。但是我们通过方法的声明就可以确定方法的功能,只不过具体实现功能的代码在子类中进行设计。当子类继承抽象类之后,必须重写其中的抽象方法,否则还是一个抽象类。

abstract修饰抽象类时,表示此类为抽象类。抽象类不能被实例化,但是抽象类中仍然存在构造器,当子类实例化对象时,需要直接或间接的调用到抽象类的构造器。在抽象类中,可以没有抽象方法,但是抽象方法一定是在抽象类中。

abstract不能共同的关键字

1. 不能修饰private修饰的方法,毕竟private修饰的方法不能在除自己以外的其他类中使用。

2. 不能修饰静态方法。

3. 不能修饰使用final修饰的方法和类,毕竟final修饰的类和方法分别不能继承和重写。

接口(interface)

接口使用interface来表示。

接口的理解

接口的本质是契约、标准以及规范,就像我们的法律一样,指定好以后大家都要遵守。

在我看来,接口其实就是多态的最好体现,使用接口可以在不增加冗余代码的情况下,扩展代码的适用范围。

接口内部结构的说明

接口内可以声明属性,但是属性必须使用public static final修饰,表明了属性是全局常量。

接口内可以声明方法,声明抽象方法时,使用public abstract表示;也可以声明静态方法,只不过静态方法只能通过接口调用,不能用实现类来代替;也可以声明默认方法,即default修饰的方法。

接口内不能声明构造器、代码块等内容。

接口与类

1. 类是单继承,使用class关键字定义,使用extends关键字来继承。一个类只能继承一个父类。

2. 接口是多实现,使用interface关键字定义,使用implements来实现。一个类可以实现多个接口。

3. 类实现接口之后,必须将其中所有的接口都重写,否则类就要声明为抽象类。

抽象类与接口

1. 两者都可以声明抽象方法,都不能被实例化。

2. 抽象类有构造器,接口没有构造器。

接口与接口

接口与接口之间是继承关系,并且可以多继承。

在上篇介绍完面向对象的特点之后,又对特点的衍生知识进行了一些介绍。在抽象类和接口中,都可以很好的体现多态的特点。随着文章的不断输出,JavaSE也快到了尾章,后续大概还会有枚举和注解、泛型、反射以及IO四篇文章。

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

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

相关文章

Leetcode 59.螺旋矩阵Ⅱ

1.题目 2.思路 (借用代码随想录的图) 1.我们将转一圈看作一个循环(1->2->3->4->5->6->7->8 这是一个循环) 2.在这个循环里,我们要画四条边(上右下左) 填充上行从左到右 填…

Java对接腾讯云直播示例

首先是官网的文档地址 云直播 新手指南 可以发现它这个主要是按流量和功能收费的 价格总览 流量这里还只收下行的费用,就是只收观看消耗的流量费 其它的收费就是一些增值业务费 (包括直播转码、直播录制、直播截图、直播审核、智能鉴黄、实时监播、移动直…

04-ESP32S3-GPIO

ESP32S3-IDF GPIO GPIO简介 ESP32S3提供了多达45个物理GPIO管脚,这些管脚不仅可以作为通用的输入输出接口,还可以连接到内部外设信号。通过GPIO交换矩阵、IO MUX和RTC IO MUX,可以灵活地配置外设模块的输入信号来源于任何GPIO管脚&#xff0…

空间复杂度(数据结构)

概念: 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复…

【性能测试】性能测试各知识第1篇:性能测试大纲【附代码文档】

性能测试完整教程(附代码资料)主要内容讲述:性能测试大纲。。。。。。。。。。。。。。 全套笔记资料代码移步: 前往gitee仓库查看 感兴趣的小伙伴可以自取哦,欢迎大家点赞转发~ 性能测试大纲 |序号|阶段|概述| |--…

【MATLAB第100期】基于MATLAB的多种改进拉丁超立方LHS数据抽样方法

【MATLAB第100期】基于MATLAB的多种改进拉丁超立方LHS数据抽样方法 一、LHS种类 1、LHS 使用随机搜索生成拉丁超立方体样本。LHS函数特别适用于非常大的设计,当本机MATLAB函数内存不足时。这可能取决于MATLAB版本和所用机器的配置。当尝试运行“lhsdesign”但未成…

springboot实现国际化

引言 今天在开发过程中,遇到国外客户,要求项目一些返回msg中,不能再有中文,于是便有了国际化需求。 How to do 1.在项目resources下创建i18n文件夹以及messages.properties文件 messages.properties 国际化主文件 phoneErr.ms…

Guiding Large Language Models viaDirectional Stimulus Prompting

1. 通过定向刺激提示指导大语言模型 论文地址:[2302.11520] Guiding Large Language Models via Directional Stimulus Prompting (arxiv.org) 源码地址:GitHub - Leezekun/Directional-Stimulus-Prompting: [NeurIPS 2023] Codebase for the paper: &qu…

C语言——函数指针——函数指针数组 (详解)

函数指针数组 函数指针数组的作用 函数指针数组是一个数组,其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量,可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。 函数指针数组的使用场景有很多&…

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器,想搭建一个站库分离的wordpress为主的网站,采用d…

docker容器的数据卷

1配置数据卷 docker run --namen01 -d --restartalways -p 80:80 -v /qy172/data/nginx/html:/usr/share/nginx/html nginx 2Docker应用部署 1搜索mysql镜像 docker search mysql 2拉取mysql镜像 docker pull mysql:5.6 3创建容器, 设置端口映射、目录映射 d…

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题,就是根据给出的数组元素个数N,从[1,N]找出N个元素,使得N个元素的和最小,其中随便抽两个数出来,两个数之和不能为…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求&#xff1a; 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 技术&#xff1a; Vue3 Element Plus <template><div><el-table:data"tableData"style"width…

基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的无人机三维路径规划(MATLAB)

一、无人机路径规划模型介绍 二、算法介绍 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵…

Python刘诗诗

写在前面 刘诗诗在电视剧《一念关山》中饰演了女主角任如意&#xff0c;这是一个极具魅力的女性角色&#xff0c;她既是一位有着高超武艺和智慧的女侠士&#xff0c;也曾经是安国朱衣卫前左使&#xff0c;身怀绝技且性格坚韧不屈。剧中&#xff0c;任如意因不满于朱衣卫的暴行…

Spring Boot 中使用 Redis + Aop 进行限流

Spring Boot 中使用 Redis 进行限流&#xff0c;通常你可以采用如下几种方式&#xff1a; 令牌桶算法&#xff08;Token Bucket&#xff09;漏桶算法&#xff08;Leaky Bucket&#xff09;固定窗口计数器&#xff08;Fixed Window Counter&#xff09;滑动日志窗口&#xff08…

突破编程_前端_JS编程实例(目录导航)

1 开发目标 目录导航组件旨在提供一个滚动目录导航功能&#xff0c;使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置&#xff0c;同时也能够随着滚动条的移动动态显示当前位置在目录中的位置&#xff1a; 2 详细需求 2.1 标题提取与目录生成 组件需要能够自…

CSS 居中对齐 (水平居中 )

水平居中 1.文本居中对齐 内联元素&#xff08;给容器添加样式&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><…

计算机视觉——P2PNet基于点估计的人群计数原理与C++模型推理

简介 人群计数是计算机视觉领域的一个核心任务&#xff0c;旨在估算静止图像或视频帧中的行人数量。在过去几十年中&#xff0c;研究人员在这个领域投入了大量的精力&#xff0c;并在提高现有主流基准数据集性能方面取得了显著进展。然而&#xff0c;训练卷积神经网络需要大规…

转移表回调函数实现

回调函数实现 计算器的模拟&#xff08;函数指针数组的使用&#xff09;&#xff08;回调函数&#xff09; 简化 冗余 老的代码的问题就是 冗余 写死 不能完成不同的任务 函数调用的时候只需要知道地址就可以 calc计算器 这里也称之为转移表 #define _CRT_SECURE_NO_WAR…