Java的Object类

概述:所有类的根类(父类),所有的类都会直接或者间接继承Object类

Object中的toString()方法:

如果不重写这个toString方法:默认形式是:

 return getClass().getName() + "@" + Integer.toHexString(hashCode());

这个我们可以进到Object里面去看

 


a.如果没有重写Object中的toString方法,直接输出对象名会默认调用Object中的toString方法,直接输出地址值 

这两行代码生成的结果是一样的

 b.如果重写了Object中的toString方法,再输出地址值,重写没有意义,所以重写完toString之后,应该返回对象的内容 

然后我们按住ctrl 鼠标点击list的toString方法追踪一下

可以得出这里重写了这个toString()方法。

对这个JavaBean对象重写toString方法之后也是一样

Object的equals方法:

这部分的介绍我直接通过代码的案例来讲:

第一个案例:

class A {String name;int age;@Overridepublic String toString() {return "A{" +"name='" + name + '\'' +", age=" + age +'}';}
}public class Test {public static void main(String[] args) {A a1 = new A();A a2 = new A();System.out.println(a1==a2);System.out.println(a1.equals(a2));}
}

第一段代码:我创建了一个A对象,我并没有重写equals方法,所以我们也可以知道,如果我在主函数中调用,那应该调用Object的默认equals方法

输出结果:

false
false

这是应该Object的默认equals方法比较得是地址值

第二个案例:

public class Test {public static void main(String[] args) {A a1 = new A();A a2 = new A();System.out.println(a1==a2);System.out.println(a1.equals(a2));System.out.println("========================");String a = "abc";String b = "abc";System.out.println(a==b);System.out.println(a.equals(b));}
}class A {String name;int age;@Overridepublic String toString() {return "A{" +"name='" + name + '\'' +", age=" + age +'}';}
}

 这一段代码我又创建了两个String变量:值都是"abc"

输出结果:

true

true

a==b 最后能输出true的原因是:

在Java中,当你声明两个字符串变量 ab 并初始化为相同的值 "abc" 时,System.out.println(a==b) 会输出 true。这是因为在Java中,字符串常量池(String Pool)的概念起了作用。

字符串常量池是一个特殊的内存区域,用于存储所有创建的字符串实例。当你创建一个新字符串 "abc" 时,实际上系统会在字符串常量池中查找是否有相同内容的字符串,如果找到了,就直接引用那个已经在池中的对象,而不是新建一个新的对象。所以,"abc""abc" 实际上指向的是同一个内存地址,因此 == 运算符比较它们的时候返回 true,表示它们是相等的。

 a.equals(b)最后能输出true的原因是:String重写了equals方法,在重写的方法中比较了两个字符串的序列


所以我们可以先做一个小总结:

  a.如果没有重写Object中的equals方法,那么就会调用Object中的equals方法,比较对象的地址值
  b.如果重写了Object中的equals方法,那么就会调用重写后的equals方法,应该比较对象的内容

接着我们再从idea自动给我们重写的equals方法的几行代码中分析一下逻辑:

 

    @Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;A a = (A) o;return age == a.age && Objects.equals(name, a.name);}

这一段是编辑器自动帮我们写的equals方法

首先先说明一下,这里面的this是什么,在Java面向对象的特性中有一个this

Java面向对象特性-CSDN博客

这里的this是指当前对象,也就是调用这个方法的对象:

比如:a.equals(b),那这里的a就是当前对象,也就是这个this,b就是Object o 的o 

this == o 这个的作用是判断如果比较的对象和当前对象一致的话,就不需要再比了,直接返回true

o == null 这个的作用是判断传入的对象是否为空,为空直接短路后面的判断,直接返回false

getClass() != o.getClass()这个就比较复制,需要展开来说了

看这一段代码,我试图去将A的属性中的age和name和当前对象进行比较,结果发现直接爆红

这是为什么?

因为age和name是子类(这里的子类相对的父类就是Object),父类不能调用子类私有属性

OK,写道这里肯定会有人说,向下转型就行了。

结果肯定是可以的

不过我们再来看:

 如果我们在外面传了一个list集合,那这样还能判断出来嘛

答案肯定是不能,应该是会报转换类型错误的报错java.lang.ClassCastException

解决办法是什么呢?

就是在向下转型的时候用instanceof关键字判断一下。

所以等我们把上面这些判断都明白了,自然就明白了代码自动给我们生成的getClass() != o.getClass()这段代码。

最后,我们再来说一下 "==" 和 equals的区别

在Java中,==.equals()是两个用于比较的对象运算符,但它们在用途和用法上有所不同:

  1. == 运算符:

    • 用于比较基本数据类型(如int、char等)或引用类型的变量是否指向同一内存地址。
    • 当比较对象时,它检查的是两个对象的引用是否完全相同,即它们在内存中的位置是否一样。
    • 对于字符串和数组,如果两个对象的引用相等,则==返回true,即使它们的内容相同。
  2. .equals() 方法:

    • 这是一个方法,通常由Object类定义,并在所有类中继承,包括String、Integer等引用类型。
    • 对于自定义类的对象,.equals()方法可以根据类的设计意图来判断两个对象的内容是否相等。
    • 在String类中,.equals()默认比较的是字符串的实际内容;而在其他可变类型如ArrayList,通常重写为比较元素内容而非引用。

总结来说,==主要用于直接比较对象的地址,而.equals()则是用来比较对象的内容是否相等。如果你想要比较两个对象的数据值而不是它们的引用,应该使用.equals(),除非你知道你在比较的是不可变类型(比如基本类型或String),在这种情况下,==就足够了。

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

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

相关文章

鸿蒙开发岗位就业前景分析

在信息技术飞速发展的今天,操作系统作为计算机的灵魂,一直是技术创新和市场竞争的焦点。随着华为鸿蒙操作系统的推出,鸿蒙开发岗位逐渐成为IT行业的热门话题。本文将深入探讨鸿蒙开发岗位的就业前景,揭示这一领域的就业新趋势&…

MSVCR120.DLL丢失的多种修复方法,助你快速解决dll问题

在日常生活和工作中,电脑已经成为我们不可或缺的工具。然而,在使用电脑的过程中,我们常常会遇到一些问题,其中之一就是电脑运行软件时提示找不到msvcr120.dll。如果该文件缺失或损坏,可能会导致依赖它的应用程序无法启…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中,默认情况下 root 用户是禁用 SSH 登录的,这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行:在文件中找到 PermitRootLogin 配置项。默认情况下,它通常被设置为 PermitRootLogin prohibit-password 或…

代码随想录算法训练营第55天(py)| 单调栈 | 42. 接雨水*、84.柱状图中最大的矩形

42. 接雨水* 力扣链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 思路1 暴力 按列来计算。每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中,…

Study--Oracle-05-Oracler体系结构

一、oracle 体系概览 Oracle数据库的体系结构通常包括以下主要组件: 1、实例(Instance):运行数据库的软件环境,包括内存结构(SGA)和进程结构(Background Processes and User Proces…

【电路笔记】-A类放大器

A类放大器 文章目录 A类放大器1、A类放大器概述2、A类放大器基本通用发射极配置3、变压器耦合配置4、总结在 放大器类型简介的文章中,我们介绍了不同类别的放大器。 在本文中,我们将更详细地介绍A类放大器。 在介绍不同的A类放大器配置前,首先的是要记住放大器类别的选择标…

从新手到高手:Scala函数式编程完全指南,Scala 数据类型(4)

1、Scala 数据类型 Scala 与 Java有着相同的数据类型,下表列出了 Scala 支持的数据类型:

【程序大侠传】异步架构应用回调数据接收接口偶发NPE

前序 在这片浩瀚的代码江湖中,各大门派林立,各自修炼独门绝技,江湖中的侠士们分别担任着开发、测试、产品和运维的角色,共同守护着这片数字化的疆域。 开发门派:代码剑宗 代码剑宗的弟子们精通各种编程语言&#xff…

【性能优化】Android冷启动优化

文章目录 常见现象APP的启动流程计算启动时间Displayed Timeadb dump 启动优化具体策略总结参考链接 常见现象 各种第三方工具初始化和大量业务逻辑初始化,影响启动时间,导致应用启动延迟、卡顿等现象 APP的启动流程 加载和启动应用程序; …

PTFE铲子聚四氟乙烯物料特氟龙铲粉料铲耐酸碱塑料药铲

四氟铲子主要适用于药厂、药企、医药行业专用,用于粉末状及颗粒物状样品的铲取和搅匀等。因为粉料物料对铲子材质要求无污染、本底值低,所以四氟材质成为选择。 其主要特点有: 1.外观纯白色。 2.耐高低温性:可使用温度-200℃&am…

docker 部署jitsi meet

1. 部署环境: 1.1 vm 虚拟机 安装的 centos 7 1.2 centos7安装docker 和 docker-compose 2.docker命令 官网部署文档地址:(文档地址有可能失效) Self-Hosting Guide - Docker | Jitsi Meet 2.1Download and extract the late…

基于yolo的物体识别坐标转换

一、模型简介: 1.1、小孔成像模型简图如下:不考虑实际相机中存在的场曲、畸变等问题 相对关系为: 为了表述与研究的方便,我们将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的 相对关系为: 二、坐标系简介: **世界坐标系(world coo…

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置,尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息,需要特殊的激励信号和解调、计算措施,才能将旋转变压…

Element UI搭建使用过程

本章内容基于上一篇---Vue-cli搭建项目基础版 Vue-cli搭建项目----基础版-CSDN博客 官网地址:Element - The worlds most popular Vue UI framework 介绍:完全基于Vue.js ,用于快速搭建用户界面. 第一步:安装ElementUI 在终端输入 npm i element-ui -S 在main.js输入 …

Golang-map理解

golang-map语雀笔记整理 map的底层实现hmapbmap map是如何做到O(1)的复杂度的?map扩容策略 师兄问题回答 map的底层实现 hmap hmap的结构体核心字段有:buckets 桶数组地址, B 定位值,桶的数目是2^B个, count 当前map的…

一个 API 客户端和一份 TS 学习手册

第75期: Insomnia:超好看的 API 客户端 项目介绍: 一款适用于 GraphQL、REST、WebSockets 和 gRPC 的开源 API 客户端,颜值超高。 跨平台,支持 Mac、Windows 和 Linux。但不支持网页版,需要下载客户端。…

【AI编译器】triton学习:矩阵乘优化

Matrix Multiplication 主要内容: 块级矩阵乘法 多维指针算术 重新编排程序以提升L2缓存命 自动性能调整 Motivations 矩阵乘法是当今高性能计算系统的一个关键组件,在大多数情况下被用于构建硬件。由于该操作特别复杂,因此通常由软件提…

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法(WOA)原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物,即系数向量 A 可…

七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3

前言 llama 3出来后,为了通过paper-review的数据集微调3,有以下各种方式 不用任何框架 工具 技术,直接微调原生的llama 3,毕竟也有8k长度了 效果不期望有多高,纯作为baseline通过PI,把llama 3的8K长度扩展…

应用案例 | 如何监测高价值货物在物流运输过程中受到的振动和冲击?全面保障货物安全

一、货物运输 不同种类的货物对运输的要求不同,钢铁、煤炭、矿石等大宗物资通常对运输要求较低,而电子产品、IT 产品、家电等高价值敏感类货物则更强调运输的安全性和时效性,往往希望能尽可能安全和快速送达这类货物,使之尽快进入…