Java基础(7) Object类

目录

一、Object类是什么?

1.定义

2.作用

二、Object类的方法之equals()

1.==

2.equals()

3.==和equals的区别

三、Object类的方法之toString()

 四、Object类的方法之clone()

1.定义

2.基本概念

3.使用clone()方法的步骤

4.举例

五、Object类的方法之finalize()

1.概念

2.举例

六、Object类的方法之getClass()

1.概念

2.举例

总结


一、Object类是什么?

1.定义

        类 java.lang.Object是类层次结构的根类,即所有其它类的父类。每个类都使用 Object 作为超类。

2.作用

        Object类型的变量与除Object以外的任意引用数据类型的对象都存在多态引用

method(Object obj){…} //可以接收任何类作为其参数

Person o = new Person();  
method(o);

  • 所有对象(包括数组)都实现这个类的方法。

  • 如果一个类没有特别指定父类,那么默认则继承自Object类。例如:

public class Person {
    ...
}
//等价于:
public class Person extends Object {
    ...
}


二、Object类的方法之equals()

1.==

基本类型比较值:只要两个变量的值相等,即为true。 

int a=10; 
if(a==22){…}

引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。

Person p1=new Person();  	    
Person p2=new Person();
if (p1==p2){…}

用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错。

2.equals()

所有类都继承了Object,也就获得了equals()方法。还可以重写。

只能比较引用类型,Object类源码中equals()的作用与“==”相同:比较是否指向同一个对象。

  • 格式:obj1.equals(obj2)

  • 特例:当用equals()方法进行比较时,对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;

    • 原因:在这些类中重写了Object类的equals()方法。

  • 当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都相等

  • 重写equals()方法的原则

    • 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。

    • 自反性:x.equals(x)必须返回是“true”。

    • 传递性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。

    • 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。

    • 任何情况下,x.equals(null),永远返回是“false”;

      x.equals(和x不同类型的对象)永远返回是“false”。

class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写equals()方法@Overridepublic boolean equals(Object obj) {// 检查是否是同一个对象的引用if (this == obj) {return true;}// 检查对象是否为空,或者对象是否是不同的类型if (obj == null || getClass() != obj.getClass()) {return false;}// 将obj转换为Person类型Person other = (Person) obj;// 比较对象内容return age == other.age && (name != null ? name.equals(other.name) : other.name == null);}public static void main(String[] args) {Person person1 = new Person("Alice", 25);Person person2 = new Person("Alice", 25);Person person3 = new Person("Bob", 30);// 自反性System.out.println("Reflexivity: " + person1.equals(person1)); // true// 对称性System.out.println("Symmetry: " + person1.equals(person2)); // trueSystem.out.println("Symmetry: " + person2.equals(person1)); // true// 传递性Person person4 = new Person("Alice", 25);System.out.println("Transitivity: " + person1.equals(person2)); // trueSystem.out.println("Transitivity: " + person2.equals(person4)); // trueSystem.out.println("Transitivity: " + person1.equals(person4)); // true// 一致性System.out.println("Consistency: " + person1.equals(person2)); // trueSystem.out.println("Consistency: " + person1.equals(person2)); // true// 比较nullSystem.out.println("Null comparison: " + person1.equals(null)); // false// 比较不同类型String str = "some string";System.out.println("Different type comparison: " + person1.equals(str)); // false}
}

3.==和equals的区别

  • == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

  • equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。

  • 具体要看自定义类里有没有重写Object的equals方法来判断。

  • 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。


三、Object类的方法之toString()

方法签名:public String toString()

① 默认情况下,toString()返回的是“对象的运行时类型 @ 对象的hashCode值的十六进制形式"

② 在进行String与其它类型数据的连接操作时,自动调用toString()方法

Date now=new Date();
System.out.println(“now=”+now);  //相当于
System.out.println(“now=”+now.toString()); 

③ 如果我们直接System.out.println(对象),默认会自动调用这个对象的toString()

因为Java的引用数据类型的变量中存储的实际上时对象的内存地址,但是Java对程序员隐藏内存地址信息,所以不能直接将内存地址显示出来,所以当你打印对象时,JVM帮你调用了对象的toString()。

④ 可以根据需要在用户自定义类型中重写toString()方法 如String 类重写了toString()方法,返回字符串的值。

s1="hello";
System.out.println(s1);//相当于System.out.println(s1.toString());

public class Animal {private String name;private int age;@Overridepublic String toString() {return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}';}
}

 四、Object类的方法之clone()

1.定义

clone()方法是Java中用于创建对象副本的一种方法。它由Object类定义,并且所有类都继承了它。下面是关于clone()方法的详细讲解:

2.基本概念

  • 浅拷贝: 复制对象时,只复制对象的基本数据类型字段,对于引用类型字段,只复制引用而不复制引用指向的对象。
  • 深拷贝: 复制对象时,不仅复制对象的基本数据类型字段,还复制引用类型字段引用的对象,即复制整个对象图。

3.使用clone()方法的步骤

(1)实现Cloneable接口:

一个类必须实现Cloneable接口,否则调用clone()方法时会CloneNotSupportedException

(2)重写clone()方法:

在类中重写clone()方法,并将其访问修饰符设为public

4.举例

class Person implements Cloneable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}// 重写clone()方法@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';}public static void main(String[] args) {try {Person person1 = new Person("Alice", 25);Person person2 (Person) person1.clone();// 输出两个对象System.out.println("person1: " + person1);System.out.println("person2: " + person2);// 比较两个对象是否是同一个引用System.out.println("person1 == person2: " + (person1 == person2)); // falseSystem.out.println("person1.equals(person2): " + person1.equals(person2)); // true} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}
  • 实现Cloneable接口:

    • class Person implements CloneablePerson类实现了Cloneable接口,表示该类的实例可以被克隆。
  • 重写clone()方法:

    • protected Object clone() throws CloneNotSupportedException:重写clone()方法,并调用super.clone()来实现浅拷贝。
    • super.clone()方法调用父类Objectclone()方法,创建当前对象的副本。
  • 测试代码:

    • 创建person1对象,并通过clone()方法创建person2对象。
    • 输出person1person2的内容。
    • 比较person1person2是否是同一个引用(结果为false,因为是两个不同的对象)。
    • 比较person1person2的内容是否相等(结果为true,因为内容相同)。

五、Object类的方法之finalize()

1.概念

  • 当对象被回收时,系统自动调用该对象的 finalize() 方法。(不是垃圾回收器调用的,是本类对象调用的)

    • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

  • 什么时候被回收:当某个对象没有任何引用时,JVM就认为这个对象是垃圾对象,就会在之后不确定的时间使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize()方法。

  • 子类可以重写该方法,目的是在对象被清理之前执行必要的清理操作。比如,在方法内断开相关连接资源。

    • 如果重写该方法,让一个新的引用变量重新引用该对象,则会重新激活对象。

  • 在JDK 9中此方法已经被标记为过时的。

2.举例

public class Resource {private String resourceName;public Resource(String resourceName) {this.resourceName = resourceName;System.out.println(resourceName + " has been created.");}@Overrideprotected void finalize() throws Throwable {try {System.out.println(resourceName + " is being finalized.");// 在这里执行必要的清理操作,比如关闭资源} finally {super.finalize();}}public static void main(String[] args) {Resource res = new Resource("MyResource");// 将res置为null,使对象成为垃圾对象res = null;// 手动调用垃圾回收器System.gc();// 等待一段时间以确保垃圾回收器有机会运行try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("End of main method");}
}
  • Resource类:

    • resourceName:资源的名称。
    • Resource(String resourceName):构造函数,创建资源对象时输出信息。
    • finalize():重写的finalize()方法,在对象被回收之前执行清理操作。
  • main方法:

    • 创建一个Resource对象res
    • res设置为null,使其成为垃圾对象。
    • 调用System.gc(),请求JVM进行垃圾回收(注意,这只是请求,JVM可能不会立即执行垃圾回收)。
    • 使用Thread.sleep(1000)等待一段时间,以确保垃圾回收器有机会运行。
    • 打印"End of main method"。

六、Object类的方法之getClass()

1.概念

public final Class<?> getClass():获取对象的运行时类型

因为Java有多态现象,所以一个引用数据类型的变量的编译时类型与运行时类型可能不一致,因此如果需要查看这个变量实际指向的对象的类型,需要用getClass()方法

2.举例

package com.example;public class Person {// 省略类定义
}public class Main {public static void main(String[] args) {Object obj = new Person();System.out.println(obj.getClass()); // 运行时类型}
}

运行结果:class com.example.Person


总结

        本篇对Java的Object类进行了详细介绍,其中也对几个重要方法进行了讲解。部分内容源自网络,如有侵权请联系作者删除,谢谢!

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

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

相关文章

自动化测试文档

自动化测试文档的类型 自动化测试方案&#xff1a; 目的&#xff1a;描述自动化测试的目标、范围、方法、资源等。内容&#xff1a;通常包含测试计划、测试用例设计、测试环境配置、测试执行策略、预期结果、风险评估等。自动化测试脚本&#xff1a; 目的&#xff1a;用于执行…

Redis与缓存失效策略:实现高效的数据过期处理

I. 引言 A. 介绍Redis的用途和作用,特别强调其在缓存方面的重要性 Redis是一种开源的,基于内存的数据结构存储系统,支持多种类型的数据结构,如字符串、列表、集合、哈希表、有序集合等。由于其高速的读写性能,Redis被广泛应用为缓存系统,提升应用的响应速度和扩展能力。…

Vue TypeScript 实战:掌握静态类型编程

title: Vue TypeScript 实战&#xff1a;掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境下为Vue.js应用搭建项目结构&#xff0c;包括初始化配置、创建Vue组件、实现状态管理利用Vuex、配置路由以及性能优化的方法&#x…

数据中心网络运维探讨

数据中心网络运维探讨 数据中心网络运维通过科学的网络架构设计、实时监控管理、智能化运维工具和全面的安全防护&#xff0c;确保网络的高效、安全运行。它不仅提升了运维效率和网络可靠性&#xff0c;还保障了业务的连续性和数据安全。随着技术的不断进步&#xff0c;智能化…

推测性解码:加速多模态大型语言模型的推理

大模型&#xff08;LLMs&#xff09;以其卓越的性能在多个应用场景中大放异彩。然而&#xff0c;随着应用的深入&#xff0c;这些模型的推理速度问题逐渐凸显。为了解决这一挑战&#xff0c;推测性解码&#xff08;Speculative Decoding, SPD&#xff09;技术应运而生。本文深入…

volatile、extern、static关键字

一、volatile volatile关键字用于告诉编译器&#xff0c;一个变量的值可能在程序执行期间以不可预见的方式发生变化&#xff0c;编译器不应对该变量进行优化。即&#xff1a;编译器不能对这个变量进行优化&#xff0c;必须每次都从内存中读取它的值&#xff0c;而不能缓存到寄存…

Vue 2看这篇就够了

Vue 2 技术文档 Vue.js 是一款用于构建用户界面的渐进式框架。与其他重量级框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。而 Vue.js 2&#xff08;以下简称 Vue…

Vue2基础:.sync修饰符的使用,认识,作用,本质案例演示,实现父子之间的通信。

.sync的作用&#xff1a; 可以实现子组件与父组件数据的双向绑定&#xff0c;简化代码。 与v-model的不同点,prop属性名可以自定义&#xff0c;不要一定要用value. .sync的本质&#xff1a; 就是&#xff1a;属性名和update&#xff1a;属性名合写。 下面我们进行代码演示…

探索智慧景区票务系统的架构与应用

随着旅游业的迅速发展&#xff0c;智慧景区票务系统已经成为提升景区管理效率、优化游客体验的重要工具。智慧景区票务系统的架构设计与应用&#xff0c;将现代信息技术与景区管理相结合&#xff0c;为景区的门票销售、入园管理和游客服务提供了全新的解决方案。本文将深入探讨…

每天一个数据分析题(三百五十六)-图表决策树

图表决策树中将图表分成四类&#xff0c;分别是&#xff1f; A. 比较类 B. 序列类 C. 构成类 D. 描述类 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案

【西瓜书】9.聚类

聚类任务是无监督学习的一种用于分类等其他任务的前驱过程&#xff0c;作为数据清洗&#xff0c;基于聚类结果训练分类模型 1.聚类性能度量&#xff08;有效性指标&#xff09; 分类任务的性能度量有错误率、精度、准确率P、召回率R、F1度量(P-R的调和平均)、TPR、FPR、AUC回归…

滑动窗口算法:巧妙玩转数据的窗外世界

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 滑动窗口是什么&#xff1f; 二 相关题目解析 1. 长度最小的子数组 &#x1f973;题目解析 &#x1f973;算法原理 ✏️思路1 暴力枚举出所有子数组之和 ✏️思路2 滑动窗…

docker-compose部署mysql+nginx+redis

docker部署 参考&#xff1a; docker部署mysqlnginxredis docker-compose部署mysqlnginxredis mysql 1、创建docker-compose-mysql.yml version: "3" services:mysql:image: mysql:5.7restart: alwayscontainer_name: mysqlports:- 3306:3306volumes:- /home/my…

LangChain开发【NL2SQL】应用

前言 关于LangGraph的简单介绍&#xff0c;请参考这篇博客&#xff1a; LangGraph开发Agent智能体应用【基础聊天机器人】-CSDN博客 对比LangChain实现NL2SQL 关于用LangChain开发NL2SQL的Agent应用&#xff0c;在这篇博客提供了完整的代码实现&#xff1a; LangChain开发…

AI网络爬虫:批量爬取豆瓣图书搜索结果

工作任务&#xff1a;爬取豆瓣图书搜索结果页面的全部图书信息 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个爬虫Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 用 fake-useragent库设置随机的请求头&#xff1b; 设置chr…

深拷贝浅拷贝解析,从原理理解深拷贝

这块应该都有过比较深刻的了解了。今天加深下印象和查漏补缺下。 浅拷贝&#xff1a; let original { a: 1, b: { c: 2 } };//这边定一个obj&#xff0c;来供拷贝 let shallowCopy Object.assign({}, original);// let shallowCopy { ...original }; 创建一个浅拷贝对象拷贝…

NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍

文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…

Nginx面试题精选及参考答案(3万字长文)

目录 什么是Nginx,它主要用于哪些场景? Nginx和Apache有什么区别? 描述一下Nginx的事件驱动模型。 Nginx如何处理静态文件和动态请求? 什么是反向代理,Nginx如何实现反向代理? 如何在Linux系统中安装Nginx? Nginx的主要配置文件有哪些? 如何修改Nginx的配置以实…

软考初级网络管理员_01_计算机系统基础知识(硬件)单选题

1.在字长为16位、32位、62位或128位的计算机中&#xff0c;字长为()位的计算机数据运算精度最高。 16 32 64 128 2.8位、16位、32位和64位字长的计算机中&#xff0c;()位字长计算机的数据运算精度最高。 9 8 16 64 3.声卡的性能指标主要包括-和采样位数:在采样位数分…

如何随机化列表中的元素?

一、技术难点 在Python中&#xff0c;随机化列表中的元素通常指的是对列表进行洗牌&#xff08;shuffle&#xff09;操作&#xff0c;即在不改变列表中元素数量的前提下&#xff0c;随机改变元素的顺序。这个过程看似简单&#xff0c;但在实际实现中需要考虑一些技术细节和难点…