【Java基础】第四章 Object 类应用

news2024/11/16 2:37:48

系列文章目录

[Java基础] 第一章 String类应用及分析
[Java基础] 第二章 数组应用及源码分析
[Java基础] 第三章 StringBuffer 和 StringBuilder 类应用及源码分析
[Java基础] 第四章 Object 类应用

在这里插入图片描述


文章目录

  • 系列文章目录
  • 前言
  • 一、如何使用Object?
    • 1.1、显式继承
    • 1.2、隐式继承
    • 1.3、Object类的构造函数
  • 二、关于Object类的基本知识及应用
    • 2.1、toString()方法
      • 2.1.1、溯源
      • 2.1.2、重写toString方法,返回类里属性的值
    • 2.2、equals()方法
      • 2.2.1、溯源
      • 2.2.2、重写equals方法,比较类里属性的值是否相等
    • 2.3、hashCode()方法
      • 2.3.1、溯源
      • 2.3.2、重写hashCode方法,根据类里属性值去生成hashCode
  • 总结


前言

Java中的Object类是所有类的根类,它位于Java类层次结构的顶部。每个类都隐式地直接或间接地继承自Object类。Object类提供了一些通用的方法,可以在所有的Java对象中使用。
在这里插入图片描述


一、如何使用Object?

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。

Object 类可以显式继承,也可以隐式继承。

1.1、显式继承

public class Person extends Object{

}

1.2、隐式继承

public class Person{

}

1.3、Object类的构造函数

序号构造方法 & 描述
1Object()
构造一个新对象。

二、关于Object类的基本知识及应用

序号方法 & 描述
1protected Object clone()
创建并返回一个对象的拷贝
2boolean equals(Object obj)
比较两个对象是否相等
3protected void finalize()
当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。
4Class getClass()
获取对象的运行时对象的类
5int hashCode()
获取对象的 hash 值
6void notify()
唤醒在该对象上等待的某个线程
7void notifyAll()
唤醒在该对象上等待的所有线程
8String toString()
返回对象的字符串表示形式
9void wait()
让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
10void wait(long timeout)
让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。
11void wait(long timeout, int nanos)
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。

由于所有类都直接或间接继承自Object类,因此Object类的方法可以在任何对象上使用。但是,需要注意的是,在重写Object类的方法时,应该按照特定的需求和语义来实现,以确保正确的行为。

2.1、toString()方法

该方法返回对象的字符串表示形式。默认情况下,它返回类名和对象的哈希码。通常,我们可以重写这个方法来返回我们自定义的字符串表示形式。

package com.kelvin.spiderx.test;

/***
 * @title ObjectTest
 * @desctption Object
 * @author kelvin
 * @create 2023/7/15 12:06
 **/
public class ObjectTest {

    public static void main(String[] args) {
        // 创建一个对象
        Person person = new Person("Kelvin", 25);

        // 调用toString()方法
        String str = person.toString();
        System.out.println("toString(): " + str);
    }
}

class Person {
    private String name;
    private int age;

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

结果:

toString(): com.kelvin.spiderx.test.Person@31f5fc51

2.1.1、溯源

通过Idea的快捷键(ctrl + 鼠标左键),选中【person.toString()】,会跳转到Person类的父类Obejct的toString方法。里面的重点是Object类里的Integer.toHexString(hashCode()) 以及 System类里的identityHashCode方法。
getClass().getName():获取当前类的名称
Integer.toHexString(hashCode()) :获取当前类在虚拟机里的身份地址哈希值的字符串信息

public class Object {
	public String toString() {
	    return getClass().getName() + "@" + Integer.toHexString(hashCode());
	}
	
	/**
	* See Also:
	equals(Object), System.identityHashCode
	**/
	public native int hashCode();
}

public final class System {
	public static native int identityHashCode(Object x);
}

2.1.2、重写toString方法,返回类里属性的值

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

运行结果:

toString(): Person [name=Kelvin, age=25]

2.2、equals()方法

该方法用于比较两个对象是否相等。默认情况下,它比较对象的引用是否相等,即是否指向同一个对象。通常,我们需要根据对象的内容重写这个方法,以实现我们自己的相等逻辑。

package com.kelvin.spiderx.test;

/***
 * @title ObjectTest
 * @desctption Object
 * @author kelvin
 * @create 2023/7/15 12:06
 **/
public class ObjectTest {

    public static void main(String[] args) {
        // 创建一个对象
        Person person = new Person("Kelvin", 25);
        Person newPerson = new Person("Kelvin", 25); 

        // 调用equals()方法
        boolean isEqual = person.equals(newPerson);
        System.out.println("equals(): " + isEqual);
        System.out.println( System.identityHashCode(person) );
        System.out.println( System.identityHashCode(newPerson) );
    }
}

class Person {
    private String name;
    private int age;

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

结果:

equals(): false
366712642
1829164700

2.2.1、溯源

通过Idea的快捷键(ctrl + 鼠标左键),选中【person.equals】,会跳转到Person类的父类Obejct的equals方法。默认情况下,它比较对象的引用是否相等,即是否指向同一个对象(可以用System.identityHashCode方法来验证)。

public class Object {

    public boolean equals(Object obj) {
        return (this == obj);
    }
}

public final class System {
	public static native int identityHashCode(Object x);
}

2.2.2、重写equals方法,比较类里属性的值是否相等

重写equals方法后,比较是否相同的类,以及类里属性的值是否相等


public class ObjectTest {

    public static void main(String[] args) {
        // 创建一个对象
        Person person = new Person("Kelvin", 25);
        Person newPerson = new Person("Kelvin", 25); 

        // 调用equals()方法
        boolean isEqual = person.equals(newPerson);
        System.out.println("equals(): " + isEqual); 
    }
}

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 (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return name.equals(other.name) && age == other.age;
    }
}

运行结果:

equals(): true

2.3、hashCode()方法

该方法返回对象的哈希码,它是一个整数值。哈希码在哈希表等数据结构中常用于快速查找和比较对象。在重写equals()方法时,通常也需要重写hashCode()方法,以保证一致性。

package com.kelvin.spiderx.test;

/***
 * @title ObjectTest
 * @desctption Object
 * @author kelvin
 * @create 2023/7/15 12:06
 **/
public class ObjectTest {

    public static void main(String[] args) {
        // 创建一个对象
        Person person = new Person("Kelvin", 25);
        Person newPerson = new Person("Kelvin", 25); 

        // 调用hashCode()方法
        int hashCode = person.hashCode();
        System.out.println("hashCode(): " + hashCode);

        // 调用hashCode()方法
        int newHashCode = newPerson.hashCode();
        System.out.println("newHashCode(): " + newHashCode);
    }
}

class Person {
    private String name;
    private int age;

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

结果:

hashCode(): 366712642
newHashCode(): 1829164700

2.3.1、溯源

通过Idea的快捷键(ctrl + 鼠标左键),选中【person.hashCode】,会跳转到Person类的父类Obejct的hashCode方法(参考 System.identityHashCode 信息)。

public class Object {

        /**
     * Returns a hash code value for the object. This method is
     * supported for the benefit of hash tables such as those provided by
     * .........
     * @return  a hash code value for this object.
     * @see     java.lang.Object#equals(java.lang.Object)
     * @see     java.lang.System#identityHashCode
     */
    public native int hashCode();
}

public final class System {
	public static native int identityHashCode(Object x);
}

2.3.2、重写hashCode方法,根据类里属性值去生成hashCode

重写hashCode方法后,对类里属性值去生成hashCode,如果2个类里属性的值相等,生成的hashCode也会相等。


public class ObjectTest {

    public static void main(String[] args) {
        // 创建一个对象
        Person person = new Person("Kelvin", 25);
        Person newPerson = new Person("Kelvin", 25); 

        // 调用hashCode()方法
        int hashCode = person.hashCode();
        System.out.println("hashCode(): " + hashCode);

        // 调用hashCode()方法
        int newHashCode = newPerson.hashCode();
        System.out.println("newHashCode(): " + newHashCode);
    }
}

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);
    }
}

运行结果:

hashCode(): 838204497
newHashCode(): 838204497


总结

除了上述方法之外,Object类还提供了一些其他的通用方法,如clone()、finalize()、getClassLoader()等。

由于所有类都直接或间接继承自Object类,因此Object类的方法可以在任何对象上使用。但是,需要注意的是,在重写Object类的方法时,应该按照特定的需求和语义来实现,以确保正确的行为。

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

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

相关文章

c++内存映射文件

概念 将一个文件直接映射到进程的进程空间中(“映射”就是建立一种对应关系,这里指硬盘上文件的位置与进程逻辑地址空间中一块相同区域之间一 一对应,这种关系纯属是逻辑上的概念,物理上是不存在的),这样可以通过内存指针用读写内…

Web-登录功能实现(含JWT令牌)

登录功能 这个登陆功能先不返回JWT令牌 登陆会返回JWT令牌 一会在登陆验证时讲解JWT令牌(返回的data就是它) 登录校验 概述 就是你比如复制一个url 用一个未曾登陆对应url系统的浏览器访问 他会先进入登陆页面 登陆校验就是实现这个功能 简而言之…

基于EasyExcel的单元格合并自定义算法处理

基于EasyExcel导出Excel后,通过对合并单元格的简单规则配置,实现如下图所示的单元格合并效果: 效果截图 原表格数据如下: 通过配置单元格合并规则后,生成的合并后的表格如下: 注:其中第三列&a…

Android Studio连接安卓手机

1. 创建项目 2. 下载Google USB Driver 点击右上角红框的【SDK Manager】->【SDK Tools】。 也可以在 【tools】->【SDK Manager】->【SDK Tools】下进入。 点击Google USB Driver,下载后点ok。 3. 环境变量 右键【我的电脑】->【高级系统设置】-&g…

基于微信小程序的高校新生自助报道系统设计与实现(Java+spring boot+MySQL+小程序)

获取源码或者论文请私信博主 演示视频: 基于微信小程序的高校新生自助报道系统设计与实现(Javaspring bootMySQL微信小程序) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1…

123、仿真-基于51单片机的电流控制仿真系统设计(Proteus仿真+程序+原理图+参考论文+配套资料等)

方案选择 单片机的选择 方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

java报错- 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。

SpringBoot使用了3.0或者3.0以上,因为Spring官方发布从Spring6以及SprinBoot3.0开始最低支持JDK17,所以仅需将SpringBoot版本降低为3.0以下即可。

ES6类-继承-Symbol-模版字符串

目录 类 继承 ES5 如何继承 ES6继承 Symbol 用途 可以产生唯一的值,独一无二的值 解决命名冲突 getOwnPropertySymbols() 作为全局注册表 缓存 Symbol.for() 消除魔术字符串 模版字符串 类 在javascript语言中,生成实例对象使用构造函数&#xf…

数据库基本操作-----数据库用户管理和授权

目录 一、数据库用户管理 1.新建用户 2.查看用户信息 3.重命名用户 4.删除用户 ​编辑5.修改当前登录用户密码 6.修改其他用户密码 7.忘记 root 密码的解决办法 (1)修…

Redis数据类型 — List

List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。 List内部实现 List 类型的底层数据结构是由双向链表或压缩列表实现的: 如果列表的元素个数小于 512 个(默认值,可由 list-m…

详解Single-Shot Alignment Network (S2A-Net) 基于遥感图像的特征对齐旋转目标检测

引言 目标检测:把图像中的物体使用方框标记起来,不同类别物体应使用不同颜色 目标检测其实是寻找物体边界框(bounding box)回归问题(regression)和对物体分类问题(classification)的统一 遥感目标检测:普通的目标检测是日常生活中的横向的图…

2.4 线性表的插入删除

1. 链表的插入删除 1. 单链表插入删除 图1. 单链表插入结点 图2. 单链表删除结点 #include <iostream>typedef struct LNode {int data;struct LNode* next; }LNode;/// <summary> /// 判断链表是否非空 /// </summary> /// <param name"p">…

常见关于数组的函数的介绍

关于字符串函数的介绍 求字符串长度 strlen函数 用于计算字符串的长度的函数&#xff0c;需要使用的库函数是string.h 函数声明 size_t strlen(const char *str)函数模拟实现 #include<stdio.h> #include<assert.h> size_t my_strlen(const char* arr) {asse…

review回文子串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 class Solution {List<List<String>> lists new ArrayList<>(); // 用于存储所有可能…

阿里瓴羊One推出背后,零售企业迎数字化新解

配图来自Canva可画 近年来随着数字经济的高速发展&#xff0c;各式各样的SaaS应用服务更是层出不穷&#xff0c;但本质上SaaS大多局限于单一业务流层面&#xff0c;对用户核心关切的增长问题等则没有提供更好的解法。在SaaS赛道日渐拥挤、企业增长焦虑愈演愈烈之下&#xff0c…

Midjourney助力交互设计师设计网站主页

Midjourney的一大核心优势是提供创意设计&#xff0c;这个功能也可以用在网站主页设计上&#xff0c;使用Midjourney prompt 应尽量简单&#xff0c;只需要以"web design for..." or "modern web design for..."开头即可 比如设计一个通用SAAS服务的初创企…

单片机第一季:零基础5——LED点阵

1&#xff0c;第八章-LED点阵 如何驱动LED点阵&#xff1a; (1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口&#xff08;16个IO口&#xff09;、要驱动16*16的点阵需要4个IO端口&#xff08;32个IO口&#xff09;。 (2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要…

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

MySQL-分库分表详解(七)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

前端是什么? 前端&#xff08;Front-End&#xff09;&#xff0c;又称浏览器端、客户端等&#xff0c;是指 Web 应用程序中负责用户交互、界面展示和数据展示的部分。前端技术体系主要包括 HTML、CSS 和 JavaScript 等内容。 其中&#xff0c;HTML&#xff08;Hypertext Mar…