Object类详解

news2025/2/26 11:37:42

Object类详解

  • equals方法
    • == 和 equals的对比
  • hashcode 方法
  • toString方法
  • finalize 方法 (新版被弃用)

equals方法

== 和 equals的对比


== 是一个比较运算符:
  1)== :既可以判断基本类型,又可以判断引用类型;

  2)== :如果判断基本类型,判断的是值是否相等;

  3)== :如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象。

public class Equals01 {
    public static void main(String[] args) {
        A a = new A();
        A b = a;
        A c = b;
        System.out.println(a == c); // ture
        System.out.println(a == b); // ture
        
        B objB = a;
        System.out.println(objB == a); // ture
    }
}
class B{}
class A extends B{}

equals 方法:
  1)是 Object类中的方法,只能判断引用类型;

  2)默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等;比如 Integer、String。

String str1 = new String("equals");
String str2 = new String("equals");
System.out.println(str1 == str2);		// false
System.out.println(str1.equals(str2));	// true


Person p1 = new Person();
p1.name = "equals";

Person p2 = new Person();
p2.name = "equals";

System.out.println(p1 == p2);	// false
// String.equals() 判断的是字符串内容是否相等
System.out.println(p1.name.equals(p2.name));	// ture
System.out.println(p1.equals(p2));	// false

hashcode 方法

  1)提高具有哈希结构的容器的效率;

  2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3)两个引用,如果指向的是不同对象,则哈希值是不一样的;

  4)哈希值主要是根据地址号来的!不能完全将哈希值等价于地址;

  5)在集合中,hashCode 如果需要的话,也会重写;

public class HashCode {
    public static void main(String[] args) {
        AA aa1 = new AA();
        AA aa2 = new AA();
        AA aa3 = aa1;

        System.out.println("aa1.hashCode() = " + aa1.hashCode());
        System.out.println("aa2.hashCode() = " + aa2.hashCode());
        System.out.println("aa3.hashCode() = " + aa3.hashCode());
    }
}
class AA{}

运行结果:
在这里插入图片描述

toString方法

基本介绍:

默认返回:全类名(包名+类名) + @ + 哈希值的十六进制;

// toString方法介绍、toString方法重写
public class ToString {
    public static void main(String[] args) {
        Monster monster = new Monster("小妖怪", "巡山的", 1000);

        // return getClass().getName() + "@" + Integer.toHexString(hashCode())
        // 1) getClass().getName()  全类名(包名+类名)
        // 2) Integer.toHexString(hashCode()) 将对象的hashCode值转成16进制字符串
        System.out.println(monster.toString());
    }
}

class Monster{
    private String name;
    private String job;
    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    // 重写 toString 方法,输出对象的属性
    // 快捷键 alt + insert -> toString
    @Override
    public String toString() {  // 重写后,一般是把对象的属性值输出
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}

重写前运行结果:
在这里插入图片描述
 
重写后运行结果:
在这里插入图片描述
 
当直接输出一个对象时,toString 方法会被默认的调用。

// 例子
	// 会默认调用 monster.toString() 方法
	System.out.println(monster);

 

finalize 方法 (新版被弃用)

 
finalize()

  当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法;
 
  1)当对象被回收时,系统自动调用该对象的 finalize 方法;子类可以重写该方法,做出一些释放资源的操作;

  2)什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法;

  3)垃圾回收机制的调用,是由系统来决定的,也可以通过 System.gc() 主动触发垃圾回收机制。

  实际开发中,几乎不会运用 finalize,更多是了解。

public class Finalize {
    public static void main(String[] args) {
        Car bwm = new Car("宝马");

        // 这时,car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象;
        // 在销毁对象前,会调用该对象的 finalize 方法;
        // 程序员就可以在 finalize 中, 写自己的业务逻辑代码(比如释放资源: 数据库连接,或者打开的文件...);
        // 如果程序员不重写 finalize,那么就会调用 Object 类的 finalize,即默认处理;
        // 如果程序员重写了 finalize,就可以实现自己的逻辑。
        bwm = null;
		
		System.gc(); // 主动调用垃圾回收器
        System.out.println("");
    }
}

class Car{
    private String name;

    public Car(String name) {
        this.name = name;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("销毁了汽车" + name);
        System.out.println("释放了一些资源...");
    }
}

运行结果:
在这里插入图片描述

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

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

相关文章

web自动化笔记一:元素定位的八种方式

一、元素定位 优先使用id定位,超链接使用link和paryial_link 二、自动化测试流程(先定位后操作) 1、自动化测试方案->2、自动化脚本编写(定位元素、操作元素、验证操作、记录测试结果)->3、执行测试用例->4、…

MATLAB环境下基于人工蜂群优化算法的卷积神经网络CNN图像识别

地球上的所有生物包括人类都在不断演变、进化,在这样的过程中逐渐适应了外界的环境,找到了适合自己的生存方式。不同的生物有不同的生存机制,群体活动作为一种常见的生存机制广泛存在于自然界中,例如蚂蚁、鸟群、鱼群、峰群甚至人…

手机和windows的便签怎么共享账号使用

在忙碌的生活中,我经常需要在手机和电脑之间同步记事信息。可是,每次当我在手机上记下一些重要事项后,想要在电脑上查看或继续编辑时,总是遇到各种麻烦。因为手机和电脑上的便签软件各不相同,无法实现账号共享和内容同…

系统性学习vue-vue3

系统性学习vue-vue3 Vue3简介创建Vue3.0工程使用vue-cli创建使用vite创建工程 分析工程结构(cli创建的)main.jsApp.vue 安装开发者工具初识setupref函数处理基本类型处理对象类型 reactive函数回顾Vue2的响应式原理vue3响应式原理—Proxyreactive对比ref…

C++面试宝典第33题:数组组成最大数

题目 给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 示例1: 输入:nums = [10, 2] 输出:"210" 示例2: 输入:nums = [3, 30, 34, 5, 9] 输出:"…

开发一款跨境电商APP的流程是什么

开发一款跨境电商系统的流程大致如下: 1.需求分析:这是开发任何软件系统的第一步。在这个阶段,你需要与客户进行深入沟通,了解他们的业务模式、目标用户、产品特点以及竞争对手等信息。通过这一步骤,你可以确定系统的…

报`Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.`错误解决办法

使用了promise,但是在使用的过程中报Uncaught (in promise)错误,第一次遇到这种错误,所以在此记录下,方便以后解决问题 Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.错误通常出现在使用fetch API发起…

pytorch 图像数据集管理

目录 1.数据集的管理说明 2.数据集Dataset类说明 3.图像分类常用的类 ImageFolder 1.数据集的管理说明 pytorch使用Dataset来管理训练和测试数据集,前文说过 torchvision.datasets.MNIST 这些 torchvision.datasets里面的数据集都是继承Dataset而来&#xff0c…

【QT+QGIS跨平台编译】之五十六:【QGIS_CORE跨平台编译】—【qgsmeshcalclexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

【Python笔记-设计模式】状态模式

一、说明 状态模式是一种行为设计模式,用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时,规避使用大量的条件语句来判断对象的状态,提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…

vue 部署后修改配置文件(接口IP)

近期,有一个项目,运维在部署的时候,接口ip还没有确定,而且ip后面的路径一直有变动,导致我这里一天打包至少四五次才行,很麻烦,然后看了下有没有打包后修改配置文件修改接口ip的方法,…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

深入理解网络通信基本原理和tcp/ip协议

深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1,计算机网络体系结构2,网络中数据传输2.1,浏览器中输入一个url的执行流程2.2,数据在网络中是的传输流程 3,三次握手和四次挥手3.1,三次握手3.1.1…

代理IP安全问题:在国外使用代理IP是否安全

目录 前言 一、国外使用代理IP的安全风险 1. 数据泄露 2. 恶意软件 3. 网络攻击 4. 法律风险 二、保护国外使用代理IP的安全方法 1. 选择可信的代理服务器 2. 使用加密协议 3. 定期更新系统和软件 4. 注意网络安全意识 三、案例分析 总结 前言 在互联网时代&…

xilinix 的硬件资源分布

从官方手册UG475中可以看出,下图中的V690T系列的i芯片,其具有的bank数量,已经上下半区的bufg对应的bank关系,实际在开发过程中,可能面临局部资源集中度过高,导致bufg的数量不够的情况,bufg的位置…

Docker数据集与自定义镜像:构建高效容器的关键要素

目录 博客前言 一.数据卷 1.数据卷介绍 2.实战 宿主机和容器共享目录 容器和容器之间共享目录 二.自定义镜像 1.自定义镜像介绍 2.实战 2.1自定义centos,具备vim及ifconfig作用 构建镜像 通过镜像运行一个容器进行测试 2.2自定义tomact(文件为…

人工智能_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0105

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来

Python3中真真假假True、False、None等含义详解

在Python中,不仅仅和类C一样的真假类似,比如1代表真,0代表假。Python中的真假有着更加广阔的含义范围,Python会把所有的空数据结构视为假,比如 [] (空列表)、 {} (空集合)、 (空字符…

初探2b blender

总结 按照youtube 教程 做了个雏形 心得 从正面, 侧面 视图整体上调整外轮廓流线型趋向, 比如正面看这个发型像个鸡蛋的外轮廓头发重要的是丝滑, 流畅 集束 层次 交错

Flutter开发进阶之Flutter Web加载速度优化

Flutter开发进阶之Flutter Web加载速度优化 通常使用Flutter开发的web加载速度会比较慢,原因是Flutter web需要加载的资源处于国外,以下是据此所做的相应优化。 一、FlutterWeb打包 flutter build web --web-renderer canvaskit使用新命令打包 flut…