JAVA里的object类

 public static String toString(Object o)                     // 获取对象的字符串表现形式
public static boolean equals(Object a, Object b)            // 比较两个对象是否相等
public static boolean isNull(Object obj)                    // 判断对象是否为null
public static boolean nonNull(Object obj)                    // 判断对象是否不为null

1.toString(获取对象的字符串表现形式)

默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值
如果我们要打印属性值,就必须重写toString方法
toString方法的结论
如果我们打印一个对象,想要看到属性值,那就必须重写toString方法
在重写的方法中,把对象的属性值进行拼接
public class objectdemo1 {public static void main(String[] args) {Student s1 = new Student();System.out.println(s1);//Object.Student@b4c966aString s2 = s1.toString();System.out.println(s2);//Object.Student@b4c966a//默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值//如果我们要打印属性值,就必须重写toString方法//toString方法的结论//如果我们打印一个对象,想要看到属性值,那就必须重写toString方法//在重写的方法中,把对象的属性值进行拼接}
}

 重写之后

@Overridepublic String toString() {return name+","+age;}public class objectdemo1 {public static void main(String[] args) {Student s1 = new Student("zhangsan",18);System.out.println(s1);//zhangsan,18String s2 = s1.toString();System.out.println(s2);//zhangsan,18//默认情况下,因为object类中的toString方法返回的是地址值,所以默认打印地址值//如果我们要打印属性值,就必须重写toString方法//toString方法的结论//如果我们打印一个对象,想要看到属性值,那就必须重写toString方法//在重写的方法中,把对象的属性值进行拼接}
}

2.equals(比较两个对象是否相等)

默认比的是地址值,由于我们创建对象肯定创建出不同的对象,在堆区会开辟不同的内存空间,所以地址值肯定不一样,所以我们就要重写父类object里的equals方法

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo2 {public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();System.out.println(s1.equals(s2));//比的是地址值}
}

结果

重新父类的equals方法

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

如果我们比较属性值:

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo2 {public static void main(String[] args) {Student s1 = new Student("张三",18);Student s2 = new Student("张三",18);System.out.println(s1.equals(s2));//比的是属性值}
}

结果

//public static boolean equals(Object a, Object b) 比较两个对象是否相等
public class objectdemo3 {public static void main(String[] args) {String s1 = "abc";StringBuffer sb = new StringBuffer("abc");System.out.println(s1.equals(sb));//false//因为equals方法是被s1调用的,而s1是字符串//所以equals要看String类中的//如果是字符串,则比较内部属性值//如果参数不是字符串,直接返回falseSystem.out.println(sb.equals(s1));//false//因为equals方法是被sb调用的,而sb是不是字符串是StringBuffer//所以equals要看StringBuffer类中的//因为StringBuffer没有重写equals方法,所以默认使用的是父类object类的equals方法//所以比较的是地址值//而这里s1和sb的地址值不一样,所以返回false}
}

结论: 

3.浅克隆和深克隆

在Java中,实现浅克隆通常意味着你需要重写对象的clone()方法。Java中的Object类提供了一个默认的clone()方法,但这个默认实现是受保护的,因此你需要让你的类实现Cloneable接口(尽管这个接口是一个标记接口,没有任何方法),并且重写clone()方法以使其为public

浅克隆 

细节:

public class objectdemo5 {public static void main(String[] args) throws CloneNotSupportedException {Day day = new Day(2024, 6, 6);// 创建一个Animal对象Animal a = new Animal("小黑", 2, day);// 浅克隆这个Animal对象//先是object cloneA=a.clone();//然后强转成Animal类型// Animal cloneA=(Animal)a.clone();Animal cloneA = (Animal) a.clone();System.out.println(cloneA);}
}

 

package Object;import java.util.Objects;// 假设我们有一个简单的类Animal,它包含基本数据类型和另一个对象的引用
public class Animal implements Cloneable{private String name;private int age;private Day day; 假设Day是另一个类,并且我们想要浅克隆它public Animal(String name, int age, Day day) {this.name = name;this.age = age;this.day = day;}public Animal() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Day getDay() {return day;}public void setDay(Day day) {this.day = day;}// 重写clone方法以实现浅克隆@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}// toString方法(可选,但有助于调试)@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +", day=" + day +'}';}
}

 

package Object;public class Day {private int year;private int month;private int day;public Day(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public Day() {}public int getYear() {return year;}public void setYear(int year) {this.year = year;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}@Overridepublic String toString() {return "Day{" +"year=" + year +", month=" + month +", day=" + day +'}';}
}

结果:

 clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存,相对应的深拷贝则会连引用的对象也重新创建。

说白了 浅克隆 是克隆的对象和被克隆的对象共享一块内存,其实一方改变,则另一方也跟着改变

深克隆

深克隆我们可以导入第三方工具类

//用第三方工具//编写代码Gson gson = new Gson();//把对象变成字符串String s = gson.toJson(a);//克隆Animal a类//再把字符串变成对象即可Animal animal = gson.fromJson(s, Animal.class);//试一下是不是深克隆 animal没有变即深克隆day.setYear(2023);//打印对象System.out.println(animal);//拷贝之后的结果

结果

说白了 深克隆 是克隆的对象和被克隆的对象不是一块内存,其实一方改变,则另一方也不会跟着改变,克隆出来的本质是拷贝了一个副本,操作的是自己属于的那块内存

 Objects

 public static void main(String[] args) {Student s1 = null;Student s2 = new Student("zhangsan", 18);//判断对象是否为nullboolean result = Objects.equals(s1, s2);System.out.println(result);//false//细节://1.方法的底层会判断s1是否为null,如果为null,直接返回false//2.如果s1不为null,那就利用s1再次调用equals方法//3.此时s1是Student类型,所以最终还是会调用Student类型中的equals方法//如果没有重写,比较的是地址值,如果重写了,比较的就是属性值了

结果:

public static boolean isNull(Object obj)                    // 判断对象是否为null
public static boolean nonNull(Object obj)                    // 判断对象是否不为null 

  Student s3 = new Student("zhangsan", 18);Student s4 = null;System.out.println(Objects.isNull(s3)); 判断对象是否为null,为null返回trueSystem.out.println(Objects.isNull(s4));

结果:

  // public static boolean nonNull(Object obj)// 判断对象是否不为nullStudent s5 = new Student("zhangsan", 18);Student s6 = null;System.out.println(Objects.nonNull(s5));//判断对象是否为不null,如果不为null返回trueSystem.out.println(Objects.nonNull(s6));

结果 

 

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

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

相关文章

基于单片机的 LED 照明灯智能调光系统设计

摘  要: 社会经济的不断发展,推动了智能化生活的进程,智能调光技术开始广泛应用在生活中,人们也逐渐提高了灯光亮灯率等的要求。基于此,笔者主要设计了基于单片机的 LED 照明灯智能调光系统,希望能够为相关…

骨传导耳机哪个牌子好?精选靠谱好用的TOP5骨传导耳机推荐!

在超过八成的音乐爱好者都面临听力健康问题的当下,骨传导耳机因其独特的听觉体验和对听力的保护,在音频设备市场中备受瞩目。但近期我发现不少用户在选购骨传导耳机时常常受到不专业产品的误导。身为有着5年经验的数码博主,在此提醒大家&…

老师怎样用微信发布期末成绩

老师们,期末季又到了,还在为如何发布成绩而头疼?今天,就让我来分享一些小技巧,让你们在微信上发布成绩更加高效,同时又能保护学生的隐私。 首先,我们要确保成绩的安全性和隐私性。在微信上&…

数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档

在 Android 手机上访问 Word 文档通常很简单,但是当这些重要文件被删除或未保存时会发生什么?这种情况虽然令人痛苦,但并非毫无希望。到 2024 年,有几种强大的方法来处理此类数据丢失。本指南重点介绍如何在Android手机上恢复已删…

Python | Leetcode Python题解之第208题实现Trie(前缀树)

题目: 题解: class Trie:def __init__(self):self.children [None] * 26self.isEnd Falsedef searchPrefix(self, prefix: str) -> "Trie":node selffor ch in prefix:ch ord(ch) - ord("a")if not node.children[ch]:retur…

2008-2022年款哈弗维修手册和电路图线路图接线图资料更新

经过整理,2005-2022年款长城哈弗全系列已经更新至汽修帮手资料库内,覆盖市面上99%车型,包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照…

word怎么转换成pdf?分享3种PDF文件转换技巧

word怎么转换成pdf?在日常办公中,将Word转换成PDF可以带来诸多便利。首先,PDF格式具有跨平台的通用性,无论在哪个操作系统或设备上,都能保持文档的原始布局和格式。其次,PDF文件不容易被篡改,可…

【Unity】 HTFramework框架(五十二)使用 HybridCLR 热更新

更新日期:2024年7月1日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 HybridCLR 热更新一、启用宏定义二、导入HybridCLR三、设置热更新程序集四、资源、代码热更 HybridCLR 热更新 HybridCLR是一个特性完整、零成本、高性能…

Mac多线程下载管理器:Neat Download Manage 最新版

Neat Download Manager(NDM)是一款功能强大的下载管理软件,它可以帮助用户更有效地管理和下载网络资源。这款软件支持多种浏览器和协议,可以提升下载速度,恢复中断的下载任务,以及自动化下载过程。在使用任…

如何设置农历日程提醒 农历提醒小妙招

在中国,农历仍然承载着深厚的文化传统和民俗意义。无论是庆祝传统节日,还是纪念亲朋的生日,农历日期都显得格外重要。然而,随着生活节奏的加快,我们有时会因忙碌而遗忘这些特殊的日子。这时,一个能够准确提…

游戏AI的创造思路-技术基础-关于艾宾浩斯遗忘曲线的迷思

对于艾宾浩斯遗忘曲线和函数,我一直都有小小的迷思,总想实验下用艾宾浩斯函数来替换sigmoid函数作为激活函数,打造更接近人类的AI算法,这篇文章旨在讨论下 目录 3.10. 艾宾浩斯曲线 3.10.1. 定义 3.10.1.1. 曲线计算公式 3.10…

干货分享:Spring中经常使用的工具类(提示开发效率)

环境:Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…

【刷题汇总--数字统计、两个数组的交集、点击消除(栈)】

C日常刷题积累 今日刷题汇总 - day0011、数字统计1.1、题目1.2、思路1.3、程序实现 2、两个数组的交集2.1、题目2.2、思路2.3、程序实现 3、点击消除(栈)3.1、题目3.2、思路3.3、程序实现 今日刷题汇总 - day001 1、数字统计 1.1、题目 请统计某个给定范围[L, R]的所有整数中…

百事可乐推出具有视频屏幕和人工智能技术的智能罐头

在最近于法国戛纳举行的国际创意节上,百事公司推出了创新的智能罐头。这些罐头不同于传统产品,它们采用了环绕式3D屏幕,能够展示高清视频内容,为品牌宣传和促销带来了全新的视角。经过两年多的精心研发,这些智能罐成为…

LLM原生开发路线图指南

引言 大型语言模型(LLM)正在迅速成为现代人工智能的基石。然而,目前还没有出现公认的最佳实践,而且先驱们往往没有明确的开发路线图。因此,这种状况急需要有人重新发明有关轮子;否则,将会使人陷…

spring中集成mybatis,并测试是否成功

首先你要配置pom.xml <!-- 连接 MySQL 数据库的驱动程序 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- spring-jdbc -->&…

Advanced slides插件无法预览幻灯片

advanced-slides的官方地址&#xff1a; MSzturc/obsidian-advanced-slides: Create markdown-based reveal.js presentations in Obsidian (github.com) 官方教程和文档&#xff1a; Advanced Slides Documentation (mszturc.github.io) 中文版也有博客翻译了&#xff1a;Ob…

软考中级系统集成项目管理工程师备考笔记

目录 一&#xff0c;通用内容 &#xff08;一&#xff09;信息与信息化 1.1&#xff0c;信息 信息基本概念 信息的传输模型 信息的质量属性 1.2&#xff0c;信息系统 信息系统的基本概念 信息系统定义 信息系统集成 1.3&#xff0c;信息化 信息化层次 信息化的核心…

66、基于长短期记忆 (LSTM) 网络对序列数据进行分类

1、基于长短期记忆 (LSTM) 网络对序列数据进行分类的原理及流程 基于长短期记忆&#xff08;LSTM&#xff09;网络对序列数据进行分类是一种常见的深度学习任务&#xff0c;适用于处理具有时间或序列关系的数据。下面是在Matlab中使用LSTM网络对序列数据进行分类的基本原理和流…

AD20操作使用part1

AD20的使用 原理图库&#xff0c;也称为元件库。文件的后缀为 .SchLib。 原理图就是表示电路板上各器件之间连接原理的图表&#xff0c;原理图绘制的前提是拥有所需的原理图库。 PCB库&#xff0c;也称为封装库。文件的后缀为 .PcbLib &#xff0c;在该文件中可以画各个器件的封…