【Java编程进阶】Object类及常用方法详解

news2024/11/26 12:38:04

在这里插入图片描述

Java 编程基础教程系列:Java 编程进阶之路【从入门到精通】 ,从入门到精通一站学习,买不了吃亏,买不了上当!!


文章目录

  • 1. Object类
  • 2. 常用的方法
    • 2.1 toString 方法
    • 2.2 equals 方法
    • 2.3 hashcode 方法
  • 3. 注意事项
  • 4. 总结

1. Object类

Object 类是 Java 默认提供的一个类,是所有 Java 类的祖先类,每个类都使用 Object 作为父类。

在这里插入图片描述

那么我们就可以使用 Object 类的引用变量指向任何类的对象。在没有明确给出一个类的父类时,Java 默认把 Object 类作为该类的父类,继承了 Object 类的所有方法。

示例:

public class Test {
    public static void main(String[] args) {
        function(new Person());
        function(new Student());
    }
    public static void function(Object obj){
        System.out.println(obj);
    }
}
class Person{
    private int age;
    private String name;
}
class Student{
    private int grade;
    private String sno;
}

在上面创建了两个不同类型的对象,并且作为实参传递给了 function 方法,此时相当于:

Object obj =new Person();

输出的是对象引用的值,也就是其指向对象的地址。

2. 常用的方法

Object 类中提供了一些方法,其中常用的方法有 toString() 方法,equals() 方法,hashcode() 方法等。在使用前导入 Object 类:

import java.util.Objects;

2.1 toString 方法

JDK源码中的toString方法:

//Object类中的toString()方法实现:
 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

toString() 方法定义在 Object 类中,返回值是 String 类型,根据调用它的对象返回类名和它的引用地址。

示例:

public class Test {
    public static void main(String[] args) {
        Person person=new Person();
        System.out.println(person.toString());
        System.out.println(person);
    }
}

class Person{
    public String name;
}

在我们打印对象的引用时,实际上是默认调用了这个对象的toString方法。返回此对象所在的类及对应的堆空间对象实体的首地址值。

该方法一般要重写后使用,一般重写是将类的对象的属性返回。在没有被重写时,返回的字符串格式是 类名@哈希值,哈希值是十六进制的。示例:

public class Test {
    public static void main(String[] args) {
        Person person=new Person();
        System.out.println(person.toString());
        System.out.println(person);
    }
}

class Person{
    private String name="张三";
    private int age=20;
    public String toString(){
        return "Person:name "+name+"  age "+age;
    }
}
/*
Person:name 张三age 20
Person:name 张三age 20
 */

2.2 equals 方法

JDK 源码中的equals()方法:

// Object类中的equals方法public boolean equals(Object obj){return (this == obj);
    // 使用引用中的地址直接来进行比较  
    }

equal()方法定义在 Object 类中,返回值是 boolean 类型,其作用是比较两个对象在堆区的地址是否相同。示例:

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("张三",18);
        Person person2=new Person("李四",20);
        boolean b=person1.equals(person2);
        System.out.println(b);
    }
}

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}
/*
false
 */

需要注意的是比较的是两个引用的值是否相同,即引用执行的地址。如果想要比较对象中的内容,可以重写该方法实现。示例:

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("张三",18);
        Person person2=new Person("张三",18);
        boolean b=person1.equals(person2);
        System.out.println(b);
    }
}

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    @Override
    public boolean equals(Object obj) {
        //判断是否为空
        if (obj == null) {
            return false ;
        } if(this == obj) {
            return true ;
        }
        // 不是Person类对象
        if (!(obj instanceof Person)) {
            return false ;
        }
        Person per = (Person) obj ; // 向下转型,比较属性值
        //此时比较时按照重写后的equal()方法的规则
        return this.name.equals(per.name) && this.age==per.age ;
    }
}
/*
true
 */

此时,我们重写了equals()方法,用来比较对象中的内容是否相同,这部分比较难,可以仔细推敲这段代码,理解其含义。

2.3 hashcode 方法

JDK源码中的hashcode()方法:

public native int hashCode();

hashcode()方法定义在Object类中,用于放回对象的 hash 代码值,确定对象在内存中存储的位置是否相同。

重写该方法使用:

import java.util.Objects;

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("张三",18);
        Person person2=new Person("张三",18);
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
    }
}

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
/*
24022538
24022538
*/

事实上 hashCode() 在散列表中才有用,在其它情况下没用,在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

3. 注意事项

重写 equals() 方法时,也必须重写 hashcode() 方法吗?

答:必须,hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度,当重写equals方法后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中相同对象必须有相同哈希值的约定。

== 和 equals 的区别是什么?

答:对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;

  • 引用类型:比较的是引用是否相同

例如在比较两个字符串时:

public class Test {
    public static void main(String[] args) {
       String s1=new String("HelloWorld");
       String s2=new String("HelloWorld!");
       String s3="HelloWorld";
       System.out.println(s1.equals(s2));
       System.out.println(s1.equals(s3));
    }
}

运行结果是

false
true

为什么会出现这样的结果呢?这里就引出了一个新的概念,字符串常量值。字符串有两种赋值方式,一种是字面值的方式赋值,另一种是 new 一个新的对象,这两种方式在性能和内存方面都存在差异。

当使用字面值的方式创建一个对象时,JVM 会在字符串常量池中寻找是否存在这个对象 "HelloWorld",如果不存在,则创建这个对象,并将这个对象的引用地址返回给字符串常量 s3,如果存在,则不创建对象,直接返回池中这个对象的地址。这样我们就不难理解上面这段的代码为什么会出现这样的情况了!

4. 总结

Object 类是 Java 默认提供的一个类,是所有 Java 类的祖先类,每个类都使用Object作为父类。Object 类中提供了一些方法,这些方法为了达到想要的效果,我们一般在类中重写使用!


在这里插入图片描述

欢迎订阅学习Java编程进阶之路专栏,专栏文章持续更新!

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

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

相关文章

Verilog语法笔记(夏宇闻第三版)-数据类型及其常量、变量

目录 常量: 整数: x和z值: 负数: 下划线(underscore_): 参数(Parameter)型: 变量: wire型: reg型: memory型: Verilog HDL中总共有十九种数据类型,数据类型是用来表示数字…

SSH远程连接服务详解

远程连接服务器 一,远程连接服务器简介 1、什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录 linux 主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在…

MyBatis Plus学习笔记

MyBatis Plus 国产的开源框架,基于 MyBatis 在Mybatis-Plus中,内置了代码生成器,我们可以通过该工具,生成我们需要的代码,例如:entity层,controller层,mapper层,service…

Java面向对象:构造器、this

目录构造器学构造器的目的构造器的作用样例构造器的注意事项总结this关键字this关键字是什么样例this关键字的作用总结构造器 学构造器的目的 真正知道对象具体是通过调用什么代码得到的。能够掌握为对象赋值的其他简便写法。为以后学习面向对象编程的其他内容做支撑。 构造…

Python实现可视化案例:采集天气数据并可视化分析

前言 最近长沙的天气,真的就是不能理解,大起大落的,就跟我的心情一样… 有点无聊就来采集一些天气数据,做个可视化的小案例吧(我采集的是以前北上广深的天气数据哈) 实现案例的步骤 一.分析数据来源 从…

狂神说笔记——Linux快速入门27

Linux快速入门 参考于:B站狂神视频! Java开发之路:JavaSE、MySQL、前端(HTML、Css、JS)、JavaWeb、SSM框架、SpringBoot、Vue、SpringCloud、Mybatis-plus、Git、Linux (CentOS 7) 操作系统&…

【Linux】-- 程序地址空间

目录 程序地址空间 进程地址空间 - 虚拟地址空间 概念引入(浅) 初步理解结构 深入理解虚拟地址 为什么要有地址空间? 程序地址空间的角度理解挂起 程序地址空间 C/C在Linux下的程序地址空间分布: 栈向低地址增长&#xff0…

透过现象看本质,我找到了Netty粘包与半包的这几种解决方案

1、粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {static final Logger log LoggerFactory.getLogger(StudyS…

怎样进行股票量化对冲策略分析?

股票量化对冲策略的分析需要从各方面去深入了解,就比如说明确量化和对冲的概念,可以先下载OA系统中“量化对冲 产品基础知识的学习,也要知道量化对冲产品在构建股票多头的同时,也构建期货空头。在市场不稳定的操作情绪之下&#x…

Git——初识git

1、git概述 1.1 简介 Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种 项目。 Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作 流分支等特性。其性能优于…

rtl8188eus Linux驱动移植

rtl8188eus Linux驱动移植 rlt8188eus作为无线USB网卡,可以给我们的Linux设备提供无线上网能力,也能配置为AP,给其它无线设备提供上网能力。在使用较低版本的内核时,内核中不含rtl8188eus驱动,因此尝试自己移植&#…

1、常见的存储设备

文章目录较为常见的存储设备机械硬盘简介固态硬盘简介U盘简介固态U盘MMC卡SD卡简介TF卡NM卡MS卡CF卡CFExpress卡磁带光盘较为常见的存储设备 目前较为常见的存储设备,从电脑用的: 机械硬盘固态硬盘U盘固态U盘 到单反相机、运动相机、手机、行车记录仪…

BigDecimal 基本使用和常用方法

背景 涉及到比较大的数字之间的计算,使用float、double这样的浮点数就不那么准确了。因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。所以在商业计算中基本要用java.math.BigDecimal 一、初始化使用…

蹭秦霄贤流量,郭德纲凌晨时分转发老秦动态

都知道德云社董事长王慧很忙,每天除了打理公司业务,还要照顾众多徒弟们的衣食住行。王慧作为德云社董事长,她的忙都在情理之中,而郭德纲作为德云社总班主,他的时间就更加弥足珍贵了。 可是谁能想到,就是这样…

VSCode配置C++开发环境:OpenCV

文章目录Linux编译调试配置OpenCVWin10编译调试配置OpenCV参考最近在做深度学习的C部署相关工作,于是写下这篇文档记录环境配置的过程。环境配置是一项非常繁琐的工作,无论从大学做相关作业还是到工作上。做这项工作需要技术的同时,还需要点运…

从0到1完成一个Vue后台管理项目(一、创建项目)

1.创建文件夹 这很简单,自己选一个盘,然后建一个文件夹即可 我选择的是D盘,最后的目录是vue-admin 注意:最后的目录一定要是英文 2.创建项目 初始化 npm init -y 局部安装vue-cli vue-cli的版本一直在更新,所以不推…

品牌舆情总结及品牌修复,品牌舆情监测监控怎么做?

如今互联网大数据时代,信息流通越来越快,影响覆盖面广。品牌一旦出现舆论,很容易引起大范围的热议,对品牌发展造成不利影响,进而影响品牌声誉。接下来TOOM舆情监测小编带您简单了解品牌舆情总结及品牌修复,…

Linux_Study

文章目录1.操作系统概述1.1 操作系统的作用1.2 常见的操作系统2.Linux介绍2.1 诞生2.2 Linux内核3. Linux基础操作3.1 虚拟机快照3.2 Linux 目录结构3.3 命令、命令行3.4 ls命令(列表命令)3.5 cd/pwd命令(目录命令)3.6 相对路径、…

OPENCPU学习---开发环境搭建

BC260Y-CN模组移远公司提供了QuecOpen的开发方案,可以通过提供的SDK中相应的接口快速进行应用开发。开发环境的搭建,首先要准备好开发板、SDK包以及下载工具,准备好后进行编译配置即可进行开发。目前移远提供的BC260Y开发SDK版本为&#xff1…

Lambda表达式超详细总结(简单易懂)

文章目录1、什么是Lambda表达式2、为什么使用Lambda表达式3、函数式接口(lambda表达式的使用前提)4、推导Lambda表达式5、Lambda表达式语法1、什么是Lambda表达式 Lambda表达式,也可称为闭包。其本质属于函数式编程的概念,是Java…