Java SE-object类和里面的3个主要方法解读

news2024/11/24 20:58:19

文章目录

  • 1.object类
  • 2.toString方法调用过程
    • 2.1具体案例
    • 2.2源代码查看
    • 2.3方法的重写
    • 2.4重写效果
  • 3.equals方法调用过程
    • 3.1现象的描述
    • 3.2方法的重写
    • 3.3IDEA自动填充
  • 4.hashcode方法

1.object类

java里面除了object类,所有的类都是存在继承关系的,object类是我们任何类的父类,所有的类的对象都可以使用object的引用进行接收;
在这里插入图片描述

object里面哟有很多的方法需要我们去掌握,但是今天我们只会去演示这个toString()方法,equals()方法,hashcode()方法:

2.toString方法调用过程

2.1具体案例

下面的这个就是我们自己的这个一个包,在这个包里面我们自己定义了一个student.java文件,这个文
件的内容如下图所示,这个里面有我们的这个person类,我们的这个student这个类是继承了我们的这
个person类,在这个主函数里面,我们使用这个基类创建了一个对象,并对于这个基类里面的成员变
量进行初始化,最后使用这个println打印输出这个对象的相关的信息;
在这里插入图片描述
打印结果是有多个部分组成,例如这个里面的demo2是我们的包的名字,person是这个包里面的类,后面的这个就是地址,总之这个打印结果客观的反应了我们的这个对象的相关的信息,但是这个好像不是我们想要的,因为我们使用这个println想要得到的是这个对象的内容,例如这个成员变量之类的,而不是这个类似于路径加上地址的东西;
在这里插入图片描述
我们可以按照下面的这个途径,看一下这个结果是怎么一步一步的调用显示打印出来的:

2.2源代码查看

选中我们的这个println,按住这个ctrl+鼠标右键,这个时候我们的这个idea里面进行跳转;(按下这个ctrl之后,选中这个时候println下面会出现蓝色的下划线,这个时候我们点击就可以实现跳转);
在这里插入图片描述
在这个代码里面我们可以发现,这个println这个里面实际上是调用的我们的这个valueof(x)就是把我们传递的参数给了这个valueof这个函数,接着我们按照相同的操作进行这个valueof的跳转;

在这里插入图片描述
这个里面是一个三目运算符,判断我们的参数是不是空的,这个里面我们需要始终记住我们的这个传递的参数就是我们的自己写的这个.java文件里面的person1这个对象,无论这个怎么跳转,我们传递的都是person1这个对象,我们的这个对象肯定不是null,所以在执行这个valueof函数里面的这个内容的时候,会执行这个obj.tostring()这个部分;

这个就是我们上面说的,实际上就是执行的我们的obj类里面的方法,这个就和我们上面介绍的内容,连接起来了,我们也在这个过程中发现了这个tostring这个方法是怎么一步一步地被调用到的,相信你也明白了;

按住这个ctrl继续跳转,这个时候就出现了我们的这个tostring方法的具体的内容,我们通过这个return语句也可以看到这个结果到底是有什么组成的了;这个语句里面有这个hashcode这个我们上面也说了,也是我们今天后面会介绍的三个方法之一;

在这里插入图片描述

总结一下:这个里面的obj对象(在valueof函数里面的参数)是我们的person1对象的引用,当我们没有重写的时候,这个调用的就是我们的这个obj引用的这个tostring方法,但是如果我们对于这个父类的方法进行重写,这个时候进行调用,就可以调用到我们子类自己的,这个就是动态绑定

没有重写就调用父类的方法,重写之后就调用自己的重写方法,这个就是动态绑定的核心要义

2.3方法的重写

我们想要实现打印这个对象的成员变量的内容,但是上面的这个object里面的这个方法显然不是我们想要的,这个时候我们就需要去对于这个方法进行重写

接下来,我们在person这个类里面对于我们的方法进行重写:这个其实也不是我们自己写,只需要点几下,这个IDEA里面就会自动生成:

首先我们要选对位置,就是我们的这个重写是写到哪里去的,这个里面是写到我们的这个person这个类里面,所以就是把我们的光标放到这个成员变量下面的这一行,进行右键,选择generate,为什么要说这个地方,就是因为我自己刚开始第一次学的时候,并没有注意到这个细节,所以重写的时候IDEA就提示说不可以写(这个就是因为没有注意这个位置,位置不对,IDEA肯定不可以写啊);
在这里插入图片描述
这个里面有很多的东西,可能我们后来会用到,但是暂时只需要看到这个toString就可以了,因为我们要使用这个;
在这里插入图片描述

接下来这个idea就会让我们选择这个内容,其实这个就是成员变量,因为我们的这个类里面只定义了一个成员变量,因此这个地方只会显示出来一个,如果我们定义了多个,这个位置就会显示出来很多,我们直接全选,点击确定;
在这里插入图片描述
这个时候,我们的这个方法重写就会被自动的填充到我们的这个代码块里面去了,@override表示的就是这个方法是被重写的;
在这里插入图片描述

2.4重写效果

这个时候,我们再次运行,显示的结果就是我们创建的这个对象的相关姓名信息,因为我们是进行了初始化的,这个就说明我们的这个成员方法生效了;

3.equals方法调用过程

3.1现象的描述

下面的这个是为了介绍这个equals方法,在原有的这个内容的基础上面添加了一些内容,例如这个age成员变量,以及这个带参数的构造函数,但是为了防止这个继承这个父类的子类报错,还是自己手动添加了一个无参数的构造函数,不然这个不写的话下面的子类里面就会报错

我们的这个带参数的构造函数,实际上也是可以自动生成的,就是按照上面的这个tostring方法重写的步骤,只不过选择的时候选择这个constractor这个部分,这个就是构造的意思吧,然后这个就会根据我们的这个成员变量写出来这个带参数的构造函数;
在这里插入图片描述
我们定义的两个对象,都是使用的带参数的构造函数进行初始化,但是这个在姓名和年龄都相同的情况下,这个打印的结果却是false,肯定是和这个方法的底层实现有关了,我们之前比较是不是相等的时候,使用的是这个equals这个方法,于是我们尝试去使用这个看看是不是可以使用这个equals对于两个对象进行比较,但是很遗憾,这个是不可以的,因为打印的结果还是false,我们使用这个ctrl跳转之后,发现这个equals的参数是object对象,我们的这个就是向上转型(从person转型到这个object这个父类),但是主要问题是这个return使用的是thisobj进行判断的,其实这个就和我们的person1person2没有什么区别了;

为什么这么说呢,因为熟悉this的朋友都是知道的,这个equals里面是有一个默认的这个thsi对象的,我们的这个person1就是这个this,因为我们的person1调用的这个方法,这个本质上就是person1和person2的比较,因此上面的两个写法就是一样的逻辑,比较出来的这个结果必然一样;
在这里插入图片描述
为什么我们之前使用的string可以进行equals的比较呢,因为我们的这个String是一个类,在这个类里面是重写了这个equals这个方法的,因此在进行比较的时候,这个调用的就是重写的这个方法,而不是父类的,但是我们的这个person是没有重写这个equals方法的,因此调用的时候只能调用这个父类的,但是父类使用的==进行比较,所以无法达到我们想要实现的效果,想要正确的进行比较,我们的这个person类就需要像这个string一样自己去实现这个方法的重写,但时候进行调用的时候调用我们自己重写的方法;
在这里插入图片描述

3.2方法的重写

下面的这个就是方法的重写,这个方法的头就是从string那个模拟实现照搬过来的:因为这个参数一个父类对象,这个地方需要进行这个类型的转换,转换为我们自己定义的这个类,然后进行判断,因为这个name是string类型的,因此这个里面的name.equals调用的就是string里面重写的,这个时候不会调用这个obj里面的,这个temp.age调用的就是这个obg里面的,反正这个1010这个可以判断,但是namename这个obj判断不出来;
在这里插入图片描述

3.3IDEA自动填充

还是进行这个generate,只不过这个时候选择的是我们的这个equals和hashcode这个,然后一路next就可以了;
在这里插入图片描述
下面的这个就是帮助我们自动填充好的这个情况:
在这里插入图片描述

4.hashcode方法

其实上面我们或多或少都用到了这个hashcode方法,这个方法就是用来获取这个对象的具体位置,相当于是我们熟悉的地址,下面演示一下这个函数的用法:

我们上面已经获取了这个重写的hashcode的代码,我们先把重写的方法注释掉,我们的两个对象的内容完全一致,我们想要他们的地址是一样的,但是这个时候运行起来就是两个不相等的地址,因为我们的object是我们的父类,所以这个调用的是我们的父类里面的这个haskCode方法;

在这里插入图片描述
我们跳转之后发现这个object这个父类里面的方法是使用native修饰的,使用这个关键字进行修饰,表达的意思就是我们的这个方法是使用的C/C++代码实现的,因此没有公开,我们是看不到的;

在这里插入图片描述
但是,我们把3.3里面自动填充的这个hasnCode放开之后,这个打印的地址就是一样的了,这个就是因为这个时候调用的是我们的自动填充的这个hashCode,而不是我们的父类里面的这个hasnCode方法;

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

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

相关文章

【Docker】03-自制镜像

1. 自制镜像 2. Dockerfile # 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["ja…

javaweb-请求和响应

1.http协议 1.1请求 1.2.响应 常见响应状态码: 状态码大全:https://cloud.tencent.com/developer/chapter/13553 常见的响应头: 2.请求和响应 2.1.请求 2.1.1postman 作用:常用于接口测试 使用:官网安装-->注册…

电脑手机下载小米xiaomi redmi刷机包太慢 解决办法

文章目录 修改前下载速度修改后下载速度修改方法(修改host) 修改前下载速度 一开始笔者以为是迅雷没开会员的问题,在淘宝上买了一个临时会员后下载速度依然最高才100KB/s 修改后下载速度 修改方法(修改host) host文…

【星汇极客】STM32 HAL库各种模块开发之DHT11模块

前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

nacos启动报错:Unable to start embedded Tomcat

报错截图: 解决方法:编辑启动脚本/nacos/bin/startup.sh,指定模式为standalone即可 修改后启动成功~

vscode配置golang

1.安装golang解释器 从网址https://go.dev/dl/下载对应的golang解释器 2.配置环境 Extensions中搜索安装go 2.配置settings.json {"go.autocompleteUnimportedPackages": true,"go.gocodeAutoBuild": false,"explorer.confirmPasteNative"…

若依权限设计与自定义新增用户

前言 若依 系统的权限设计是基于RBAC(Role-Based Access Control),即基于角色的访问控制模型,允许通过角色来管理用户的权限。 每个用户可以分配一个或多个角色。用户的权限来自于其所分配的角色。用户与角色的对应关系保存在 sys…

llama3中文版微调

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

数据结构--List的介绍

目录 1. 什么是List Collection中有那些方法? add(E e)方法 addAll(Collection c)方法 clear()方法 contains(Object o)方法 containsAll(Collection c)方法 equals(Object o)方法 hashCode()方法 isEmpty()方法 iterator()方法 remove(Object o)方法 …

[OS] 编译 Linux 内核

编译 Linux 内核:详细教程与 Kthreads 入门结合 我们将学习如何编译 Linux 内核,同时结合 Kthreads 的知识来理解各个步骤的目的。对于虚拟环境下的开发环境配置,本文将为你提供逐步指导。 1. 下载内核源代码 首先,我们需要从官…

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表,栈内数据遵循先进后出(LIFO)的原则,对于栈,只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的,如图示: 对于栈这种数据类型,我们可以采用链表或…

自动驾驶系列—揭秘毫米波雷达:自动驾驶的眼睛如何看穿复杂环境?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

Linux:无法为立即文档创建临时文件: 设备上没有空间

虚拟机磁盘空间不足解决记录 1、问题描述2、问题解决 1、问题描述 在命令行输入命令按Tab键时出现如下报错: 很明显,设备上没有空间,即磁盘空间不足。通过命令查看具体情况如下: df -h2、问题解决 首先想到的是虚拟机扩容。关机虚…

【技术白皮书】内功心法 | 第一部分 | 数据结构与算法基础(数据结构)

数据结构与算法基础 内容简介数据结构数据模型数据结构的表现形式 基本概念数据(Data)数据元素(data element)数据结构的定义物理结构和逻辑结构逻辑结构逻辑结构表现形式二元组模型集合结构模型线性结构模型树结构模型图结构模型…

Python从0到100(六十):机器学习-模型选择与交叉验证

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

有限差分方法 - 拉普拉斯算子第二部分

Finite difference method - Laplacian part 2 — ROCm Blogs (amd.com) 2023年1月4日 作者:Justin Chang, Rajat Arora, Thomas Gibson, Sean Miller, Ossian O’Reilly 在之前的拉普拉斯算子文章中,我们开发了一种基于HIP实现的有限差分模板代码&#…

springboot车位预约小程序-计算机毕业设计源码42655

摘要 随着社会发展和人口增加,城市交通压力越来越大,停车位资源的分配和管理成为一个重要问题。传统的停车位和车位预约管理方式存在信息不对称、效率低下等问题,给用户带来不便。而基于微信小程序的车位预约系统可以通过智能化、数字化、便…

布尔莎公式推导

问题的提出 原始的围绕x轴、y轴、z轴进行旋转矩阵的公式为 但是最近需要将船体坐标系转换到相应的世界坐标系之中,在查看相关论文时,看到一个三维点公式转换模型 这里的旋转矩阵为,和我之前见到的旋转矩阵是不一样的。我一开始先是看到的202…

计算机网络-------重传、TCP流量控制、拥塞控制

重传、滑动窗口、流量控制、拥塞避免 重传机制 超时重传 发送方在发送数据时会启动一个定时器,当超过指定的时间之后,还没接收到接收方的ACK确认应答报文,就会重传该数据 快重传 当发送方收到接收方三个连续的ack之后说明发送方发送的报…

蓝牙模块(BT04/HC05)

目录 一、介绍 二、模块原理 1.原理图与外形尺寸 2.引脚描述 3.蓝牙模块基础AT指令介绍 三、程序设计 usart3.h文件 usart3.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BT04A是一款蓝牙低功耗(Bluetooth Low Energy, BLE)模块&…