【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.mzph.cn/news/736181.shtml

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

相关文章

300W-500W-700W-1000W超薄制动电阻

EAK制动电阻,最大连续功率:300 W--1000W 制动电阻器,用于带有中低功率变频器 或作为充电电阻器的驱动器。 安装在变频器附近。 防护等级 IP 20 / IP 54 可根据要求提供更高的防护等级 测试电压 2.5 kV AC 可根据要求提供其他容量和安装…

SMART PLC自适应低通滤波器(收放卷线速度滤波)

一阶低通滤波器更多内容请参考信号处理专栏相关文章,常用链接如下: 1、SMART PLC 低通滤波器和模拟量采集应用 https://rxxw-control.blog.csdn.net/article/details/136595982https://rxxw-control.blog.csdn.net/article/details/1365959822、SMART PLC双线性变换和后向差…

Docker笔记-进入运行中的镜像,查看日志等操作

docker搭建好后&#xff0c;查看运行的docker镜像&#xff1a; docker ps -a 进入运行的容器&#xff0c;命令如下&#xff1a; docker exec -it <容器ID> /bin/bash # 或者&#xff0c;直接用容器里面的命令&#xff0c;比如mysql镜像 docker exec -it <容器ID>…

网络协议常见问题

网络协议常见问题 OSI&#xff08;Open Systems Interconnection&#xff09;模型OSI 封装 TCP/IP协议栈IP数据报的报头TCP头格式UDP头格式TCP (3-way shake)三次握手建立连接&#xff1a;为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。每次建立TCP连接…

蓝桥杯单片机---第十二届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.电压模式1、2输出 & LED显示5.定时器中断6.消除85C显示 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数…

【LeetCode】17.电话号码的字母组合

题目 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 给定一个仅包含数字2-9的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按任意顺序返回 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何…

Vue ECharts line3D点击空白处重置图表视角- 附完整示例

ECharts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&…

leetcode 热题 100_反转链表

题解一&#xff1a; 迭代&#xff1a;逐步修改节点指针&#xff0c;注意在修改前要保存下一个节点指针。 class Solution {public ListNode reverseList(ListNode head) {ListNode pre null;while (head! null) {ListNode temp head.next;head.next pre;pre head;head te…

使用Canvas绘制一个自适应长度的折线图

要求x轴根据数据长度自适应 y轴根据数据最大值取长度值 <template><div ref"cvsContainer" class"cvs-container"><canvas ref"cvs" class"canvas"></canvas></div> </template><script set…

Chapter20-Ideal gases-CIE课本要点摘录、总结

20.1 Particles of a gas Brownian motion Fast modules 速率的数值大概了解下&#xff1a; average speed of the molecules:400m/s speed of sound:approximately 330m/s at STP&#xff08;standard temperature and pressure&#xff09; Standard Temperature and Pres…

计算表达式x*(2^i)的值math.ldexp(x, i)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算表达式x*(2^i)的值 math.ldexp(x, i) [太阳]选择题 关于以下代码输出的结果说法正确的是&#xff1f; import math print("【执行】math.ldexp(3,2)") print(math.ldexp(3,2)) …

HTML5+CSS3+移动web——CSS基础

系列文章目录 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501HTML5CSS3移动web——列表、表格、表单-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136221443?spm1001.2…

【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

wordpress博客趣主题个人静态网页模板

博客趣页面模板适合个人博客&#xff0c;个人模板等内容分享。喜欢的可以下载套用自己熟悉的开源程序建站。 博客趣主题具有最小和清洁的设计&#xff0c;易于使用&#xff0c;并具有有趣的功能。bokequ主题简约干净的设计、在明暗风格之间进行现场切换。 下载地址 清新个人…

【金三银四】Spring面试题

目录 1、什么是Spring2、说一下Spring的IOC3、Spring的AOP4、连接点&#xff1f;切入点&#xff1f;5、Spring AOP 是通过什么实现的6、Spring Bean的生命周期是怎么样的&#xff1f;7、Spring Bean的初始化过程是怎么样8、Spring的事务传播机制有哪些&#xff1f;9、Autowired…

割点原理及封装好的割点类

作者推荐 视频算法专题 预备知识 本分析针对&#xff1a;连通无向图G。 搜索树 节点的父子关系&#xff1a;任意 节点的邻接 节点除了已处理 节点&#xff0c;都是它的子 节点。 以任意一点为根开始DFS&#xff0c;计算所有 节点的父子关系。只保留个子 节点到父 节点形成…

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…

Python编程与人工智能应用 MOOC题目

第二次作业 1. 2. . 3.考察“字符串的这些api函数均是提供一个拷贝本”的知识点。 4.这边的2别忘&#xff0c;前闭后开区间&#xff0c;否则对于121这样会认为是质数&#xff08;11*11&#xff09;

VMware 集群-虚拟机配置反亲和性(互斥)

简介 博客&#xff1a;https://songxwn.com/ 为实现应用系统的冗余&#xff0c;经常会双机或者多机部署&#xff08;如数据库集群等&#xff09;。在VMware 集群里面&#xff0c;要保证不同应用集群的节点虚拟机在不同的物理宿主机上&#xff0c;防止单个宿主机故障&#xff…

开发指南004-@Query参数写法

JPA的Query注解和函数参数的绑定有多种写法&#xff0c;总结如下&#xff1a; 1、使用:形参名 2、使用?数值,数值表示形参位置,1表示第一个形参,依次类推 3、使用Param("参数名"):参数名 4、获取实体类名称,使用#{#entityName}