进阶JAVA篇-Object类与Objects类、包装类的常用API(一)

目录

API

        1.0 API概念

        2.0 Object类的常用API

        2.1 Object 中的 tostring() 方法 表示返回对象的字符串表达形式

        2.2  Object 中的 equals(Object o) 方法 ,判断两个对象的是否相等

        2.2.1深入了解如何重写Object 中的 equals(Object o) 方法

        2.2.2 对重写Object 中的 equals(Object o) 方法再深入思考一下

        2.3 Object 中的 clone() 方法,当某个对象调用这个方法时,这个方法会返回一模一样的新对象

        2.3.1分析代码注意的地方

        2.4对Object小结

3.0 Objects类的常用API

       3.1 Objects类中的 equals(Object a, Object b) 方法

        3.2 Objects类中的 isNull(Object obj) 方法

        3.3 Objects类中的 nonNull(Object obj) 方法

4.0 包装类概念

        4.1 Integer类中 valueOf(int i) 方法(其他基本数据对应的对象都大致相同,以Integer举例)

         4.1.1自动装箱:

         4.1.2自动拆箱:

         4.1.3具体来应用:

4.2 Integer类中 toString() 方法(其他基本数据对应的对象都大致相同,以Integer举例)

4.3 Integer类中 parseInt(String s) 方法(其他基本数据对应的对象都大致相同,以Integer举例)

4.3.1对 parseXxx() 方法与 valueOf() 方法小结


API

        1.0 API概念

        API中文名为:应用程序编程接口,就是JAVA已经帮我们写好了一些常用的程序,如方法、类等,我们直接拿来用就可以解决一些问题,这样就可以提高开发效率。

        2.0 Object类的常用API

        Object是所有类的祖宗类,因此,JAVA中所有类的对象都可以直接使用Object类中提供的一些方法。

        2.1 Object 中的 tostring() 方法 表示返回对象的字符串表达形式

代码如下:

public class API {public static void main(String[] args) {ToString t = new ToString();System.out.println(t.toString());//输出为:ToString@1b6d3586System.out.println(t);//输出为:ToString@1b6d3586}}
class ToString {private String name;private int age;public ToString() {}public ToString(String name, int age) {this.name = name;this.age = age;}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;}
}

        分析以上代码:第一个点,输出的代码为:ToString@1b6d3586 可以简单的理解为这就是代码一个对象的地址,地址以字符串的形式表达出来让我们来看。第二个点,用t.toString()与直接用 t 的效果是一样的,直接用变量名输出会默认调用该子类的父类Object中的toString方法。

        一般来说,我们用这个toString()方法输出地址,对我们开发用处不大,所以可以去把这个方法进行重写,对这个重写后的toString()方法是得到对象中的内容。

代码如下:

public class API {public static void main(String[] args) {ToString t = new ToString("lisi",22);System.out.println(t.toString());//输出:ToString{name='lisi', age=22}System.out.println(t);//输出:ToString{name='lisi', age=22}}}
class ToString {private String name;private int age;public ToString() {}public ToString(String name, int age) {this.name = name;this.age = age;}//对toString()进行重写@Overridepublic String toString() {return "ToString{" +"name='" + name + '\'' +", age=" + age +'}';}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;}
}

运行结果如下:

        分析以上代码:现在对象中内容是以字符串的形式输出,通过重写该方法,得到我们想到得到的内容了,所以toString()方法 存在的意义就是为了被子类重写,以便放回对象的具体内容。

        2.2  Object 中的 equals(Object o) 方法 ,判断两个对象的是否相等

        简单来说,就是判断两个对象的地址是否相等。

代码如下:

public class API {public static void main(String[] args) {Equals e1 = new Equals();Equals e2 = new Equals();Equals e3 = e2;System.out.println(e1.equals(e2));System.out.println(e1 == e2);System.out.println(e3.equals(e2));System.out.println(e3 == e2);}
}class Equals {private String name;private int age;public Equals() {}public Equals(String name, int age) {this.name = name;this.age = age;}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;}
}

运行结果如下:

                        

        对以上代码分析:第一点,首先创建了两个对象,然后用Object 中的 equals(Object o) 方法 来进行两个对象比较,结果肯定是false(因为两个对象都是通过 new 对象的,地址肯定不一样的)。第二点,这个效果跟直接用 == 的效果是一摸一样的,都是通过比较地址是否相同。

        所以对这个 equals(Object o)方法 是不满足我们的需求 ,就可以重写这个方法。一般来说,需要是要通过比较对象中的内容(比如名字,年龄)来判断两个对象是否相同。

代码如下:

public class API {public static void main(String[] args) {Equals e1 = new Equals("lisi",22);Equals e2 = new Equals("lisi",22);System.out.println(e1.equals(e2));System.out.println(e1 == e2);}
}class Equals {private String name;private int age;public Equals() {}public Equals(String name, int age) {this.name = name;this.age = age;}//重写 equals(Object o) 方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Equals equals = (Equals) o;return age == equals.age && Objects.equals(name, equals.name);}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;}
}

运行结果如下:

        对以上代码进行分析:先通过有参数的构造器构建初识化的对象,然后调用重写 Object 中的 equals(Object o) 方法,从输出结果可以看出来,经过重写的方法,两个对象比较的不是对象的地址了,而是对象的具体内容。

        2.2.1深入了解如何重写Object 中的 equals(Object o) 方法

代码如下:

 //重写 equals(Object o)@Overridepublic boolean equals(Object o) {//参数是Object,可以传进任何类型的对象if (this == o) return true;//判断如果是对象自己跟对象自己比较,那肯定一样哇,//就不用比较和后面的具体的内容了//所以这里比较的是地址,相同的地址肯定是自己本身啦if (o == null || getClass() != o.getClass()) return false;//判断传进来的对象是否是空的,如果是空的话就没有必要接着后续的比较了// 或者判断两个对象的类型是否相同,// 如果不相同就没有必要接着后续具体内容比较了,肯定是false。Equals equals = (Equals) o;//强制类型转化 变量名 o 传进来的类型是 Object,需要强制转化一下。return age == equals.age && Objects.equals(name, equals.name);//接下来就是进来对象中具体内容的比较了}

        2.2.2 对重写Object 中的 equals(Object o) 方法再深入思考一下

        第一点,getClass() 方法也是0bject 类的方法,值得注意的是为什么 既然传进来的是0bject 类型的 o 为啥判断的是Equals呢?

这是因为 getClass() 方法返回的是运行时类的引用,而不是编译时的类型。因此,如果一个对象是通过子类来创建的,那么getClass()方法返回的将是子类的Class对象,而不是父类的Class对象。

因此,getClass()方法的返回值类型是根据原始对象的运行时类型决定的,而不是根据引用类型决定的。 

        第二点,我们知道字符串String 类型已经重写了equals()方法,为啥要用这个Objects.equals(name, equals.name)  方法 不直接用String类中写好的equals()方法呢?这个下面介绍到 Objects 类会讲到的,具体的原因,接着往下看。

        2.3 Object 中的 clone() 方法,当某个对象调用这个方法时,这个方法会返回一模一样的新对象。

具体使用代码如下:

public class API {public static void main(String[] args)  throws CloneNotSupportedException{Clone clone = new Clone("lisi",22);Clone clone1 = (Clone)clone.clone();System.out.println(clone1.getAge());System.out.println(clone1.getName());System.out.println("--------------------");System.out.println(clone.getAge());System.out.println(clone1.getName());}
}
class Clone implements Cloneable{private String name;private int age;public Clone() {}public Clone(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}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;}
}
        2.3.1分析代码注意的地方:

        1.重写的 clone () 的方法跟之前的有所区别,直接返回去调用父类的clone()方法,这是因为 父类的clone()方法被protected修饰,所以在为子类不同包下去访问,所以可以说这次的重写起到的作用是中介作用,或者起过度转移作用。

         2.重写完 clone () 的方法 还需要再接入一个接口 implements Cloneable。(语法规定)

        3.调用重写完之后的 clone () 的方法 返回的是Object 类型的对象,需要强制类型转换。

        4.因为会报异常,需要加上 throws CloneNotSupportedException 这串代码。

 

        2.4对Object小结

        1.toString() 方法 基本作用:返回对象的字符串表达形式。存在的意义是,让子类重写,以便返回对象的内容。

        2.equals() 方法 基本作用:比较两个对象的地址是否相同。存在的意义是,让子类重写,以便比较对象之间的具体的内容是否相同。

        3.Object 中的 clone() 方法,当某个对象调用这个方法时,这个方法会返回一模一样的新对象。

3.0 Objects类的常用API

       3.1 Objects类中的 equals(Object a, Object b) 方法

        先做非空判断,再比较两个对象,属于类方法,由类直接调用,返回值是boolean类型。

public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));//先判断是否自己本身的对象与自己本身的对象进行对比,//或者检查a对象是否为 null //最后再调用字符串String 类中的equals()方法}

        回顾:Objects.equals(name, equals.name)  方法 不直接用String类中写好的equals()方法?

        是因为Objects.equals(name, equals.name)  方法比直接使用String类中写好的equals()方法多做了一步,就是判断对象本身是否为null。简单来说,如果不使用Objects.equals(name, equals.name)  这个方法,直接用String类中写好的equals()方法 ,则对象本身是没有判断自己是否为null,而Objects.equals(name, equals.name)  方法补上了这个漏洞,进行对象与对象内容比较之前判断了对象本身是否为null。所以使用Objects.equals(name, equals.name)  方法会更加安全。

        3.2 Objects类中的 isNull(Object obj) 方法

        判断对象是否为null,如果是就返回true,若不是就false

代码如下:

public class API {public static void main(String[] args){IsNull isNull = null;IsNull isNull1 = new IsNull();System.out.println(Objects.isNull(isNull));System.out.println(Objects.isNull(isNull1));}
}
class IsNull {}

        3.3 Objects类中的 nonNull(Object obj) 方法

      判断对象是否不为null,如果不为null就返回true,若为nullfalse

代码如下:

public class API {public static void main(String[] args){NonNull nonNull1 = null;NonNull nonNull2 = new NonNull();System.out.println(Objects.nonNull(nonNull1));System.out.println(Objects.nonNull(nonNull2));}
}
class NonNull {}

4.0 包装类概念

        在JAVA中,万物皆是对象,但是发现基本数据类型不是对象。此时包装类就可以将这些不是对象的基本数据类型包装成对象。而每个基本数据类型都会对应相应对象。

        除了两个比较特殊,其他都很容易记住。 

        4.1 Integer类中 valueOf(int i) 方法(其他基本数据对应的对象都大致相同,以Integer举例)

         valueOf(int i) 方法就是将基本数据类 int 包装成对象。

代码如下:

public class API {public static void main(String[] args){Integer integer = Integer.valueOf(12);System.out.println(integer);}
}
         4.1.1自动装箱:

        基本数据类型直接会自动装箱成对象。

代码如下:

public class API {public static void main(String[] args){Integer integer = Integer.valueOf(12);System.out.println(integer);Integer integer1 = 13;System.out.println(integer1);}
}
         4.1.2自动拆箱:

        包装类型的对象会自动拆箱成基本数据类型。

代码如下:

public class API {public static void main(String[] args){Integer integer = Integer.valueOf(12);System.out.println(integer);Integer integer1 = 13;System.out.println(integer1);Integer integer2 = 14;int i = integer2;System.out.println(i);}
}
         4.1.3具体来应用:

        我们知道泛型和集合是只能接受对象的,所以不能接受基本数据类型。

代码如下:

public class API {public static void main(String[] args){ArrayList<Integer> list = new ArrayList<>();list.add(12);//自动装箱int i = list.get(0);//自动拆箱System.out.println(i);}

4.2 Integer类中 toString() 方法(其他基本数据对应的对象都大致相同,以Integer举例)

        可以将基本数据类型的数据转化为字符串。

代码如下:

import java.util.ArrayList;
import java.util.Objects;public class API {public static void main(String[] args){Integer integer = 12;String str = integer.toString();//这个用对象去调用toString()方法System.out.println(str+1);//输出结果为 121Integer integer1 = 13;String str2 = Integer.toString(integer1);//这个用类直接去调用toString()方法//这里的参数既可以直接写13,也可以integer1变量,因为自动拆箱System.out.println(str2+1);//输出结果为 131}

4.3 Integer类中 parseInt(String s) 方法(其他基本数据对应的对象都大致相同,以Integer举例)

        可以将字符串转化为基本数据类型。

代码如下:

public class API {public static void main(String[] args) {String str = "23.23";int i = Integer.parseInt(str);//这个是类去调用方法,将字符串转化为对应的基本数据类型//需要注意如果用“23.23”类似这种,程序会报错int ii =  Integer.valueOf(str);//而这种是使用valueOf()方法将字符串转换为基本数据类型的包装类对象,// 然后再通过自动拆箱操作获取基本数据类型的值。System.out.println(i+1);System.out.println(ii+1);//输出 24String str2 = "23.23";double d = Double.parseDouble(str2);double dd = Double.valueOf(str2);System.out.println(d+1);System.out.println(dd+1);//输出24.23}

        深入思考为什么可以用 valueOf() 方法将字符串转化为基本数据类型?上面讲到这个方法不是用来接收 int 数据类型,然后转化为包装类对象吗?

valueOf() 方法参数中不只是只有  int 数据类型,也可以接收String类型,转化为 Integer 包装类。

        所以这两中方法都可以将字符串转化为基本数据类型。

4.3.1对 parseXxx() 方法与 valueOf() 方法小结:

        总结起来,可以通过parseXxx()方法将字符串转换为基本数据类型,或者通过valueOf()方法将字符串转换为基本数据类型的包装类对象,然后再通过自动拆箱操作获取基本数据类型的值。



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

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

相关文章

C++医院影像科PACS源码:三维重建、检查预约、胶片打印、图像处理、测量分析等

PACS连接DICOM接口的医疗器械&#xff08;如CT、MRI、CR、DR、DSA、各种窥镜成像系统设备等&#xff09;&#xff0c;实现图像无损传输&#xff0c;实现DICOM胶片打印机回传打印功能&#xff0c;支持各种图像处理&#xff0c;可以进行窗技术调节&#xff0c;与登记台管理系统共…

差模电感和共模电感的差别

一、初步了解差模、共模的概念 超链接&#xff0c;点击鼠标打开&#xff1a;X电容和Y电容&#xff1b;差模与共模初认识 二、差模和共模电感的二者区别 共模电感和差模电感&#xff0c;是电路中常用的滤波电感、EMI器件&#xff0c;两者经常以环形电感线圈的方式存在。 首先…

【蓝桥·算法双周赛】蓝桥杯官方双周赛震撼来袭

1. 赛事前言 \space\space 大家好&#xff0c;我是执梗。在蓝桥杯中获得过十三届 Java B 组国一以及十四届 C B 组的国一。今天主要为大家带来一个好消息&#xff0c;蓝桥杯将为各位喜爱算法的小伙伴带来全新的算法双周赛。如果你热爱算法竞赛&#xff0c;或者准备参加十五届的…

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…

【开源电商网站】(2),使用docker-compose和dockerfile进行配置,设置自定义的镜像,安装插件,增加汉化包,支持中文界面汉化。

项目相关代代码地址 相关内容&#xff1a; https://blog.csdn.net/freewebsys/category_12461196.html 原文地址&#xff1a; https://blog.csdn.net/freewebsys/article/details/133666433 包括以下运行的详细代码&#xff1a; https://gitee.com/study-demo-all/oscommerc…

CTF 全讲解:[SWPUCTF 2021 新生赛]Do_you_know_http

文章目录 参考环境题目hello.php雾现User-Agent伪造 User-AgentHackBarHackBar 插件的获取修改请求头信息 雾散 a.php雾现本地回环地址与客户端 IP 相关的 HTTP 请求头X-Forwarded-For 雾散 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型…

Apache Doris (三十九):Doris数据导出 - MySQL dump导出

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

抖音小店创业攻略,快速了解这些适合新手经营的类目

抖音小店是抖音平台上的一种新型电商形态&#xff0c;它允许用户在抖音上开设自己的小店&#xff0c;销售自己的商品。抖音小店的开设门槛低&#xff0c;成本也不高&#xff0c;因此很受新手创业者的青睐。那么&#xff0c;下面不若与众将介绍抖音小店中有哪些适合新手创业者经…

Factory-Method

Factory-Method 动机 在软件系统中&#xff0c;经常面临着创建对象的工作&#xff1b;由于需求的变化&#xff0c;需要创建的对象的具体类型经常变化。如何应对这种变化&#xff1f;如何绕过常规的对象创建方法(new)&#xff0c;提供一种“封装机制”来避免客户程序和这种“具…

智能优化算法常用指标一键导出为EXCEL,CEC2017函数集最优值,平均值,标准差,最差值,中位数,秩和检验,箱线图...

声明&#xff1a;对于作者的原创代码&#xff0c;禁止转售倒卖&#xff0c;违者必究&#xff01; 之前出了一篇关于CEC2005函数集的智能算法指标一键统计&#xff0c;然而后台有很多小伙伴在询问其他函数集该怎么调用。今天采用CEC2017函数集为例&#xff0c;进行展示。 为了突…

根据前序遍历结果构造二叉搜索树

根据前序遍历结果构造二叉搜索树-力扣 1008 题 题目说明&#xff1a; 1.preorder 长度>1 2.preorder 没有重复值 直接插入 解题思路&#xff1a; 数组索引[0]的位置为根节点&#xff0c;与根节点开始比较&#xff0c;比根节点小的就往左边插&#xff0c;比根节点大的就往右…

TCP/IP(十一)TCP的连接管理(八)socket网络编程

一 socket网络编程 socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close 说明: 本文需要C语言、syscall系统调用、OS 操作系统支持,如果不了解可以暂时跳过备注&#xff1a; 知道对应库函数的更底层机制思考&#xff1a; socket函数与FIN、ACK等…

c++ 学习之 强制类型转换运算符 const_cast

看例子怎么用 int main() {int a 1;int* p a;// 会发生报错// 如果学着 c的风格类型转换int* pp (int*)a;*pp 1; // 编译不报错&#xff0c;但是运行报错// const_castconst int n 5;const std::string s "lalal";// const cast 只针对指针&#xff0c;引用&…

.NET 8 中的调试增强功能

作者&#xff1a;James Newton-King 排版&#xff1a;Alan Wang 开发人员喜欢 .NET 强大且用户友好的调试体验。您可以在您选择的 IDE 中设置断点&#xff0c;启动已经附加上调试器的程序&#xff0c;逐步执行代码并查看 .NET 应用程序的状态。 在 .NET 8 中&#xff0c;我们致…

ceph版本和Ceph的CSI驱动程序

ceph版本和Ceph的CSI驱动程序 ceph查看ceph版本Ceph的CSI驱动程序 ceph ceph版本和Ceph的CSI驱动程序 查看ceph版本 官网ceph-releases-index Ceph的CSI驱动程序 Ceph的CSI驱动程序 https://github.com/ceph/ceph-csi

微信小程序在TS模板下引入TDesign组件

介绍 TDesign 是腾讯官方出品的一款微信小程序组件库。本文介绍如何在新建ts空白模板下引入TDesign库 步骤 新建一个空白项目&#xff0c;这里可以选择TS-基础模板 新建项目目录结构如图所示&#xff1a; 注意这里其实小程序的文件都存放在miniprogram文件夹下&#xff0c;…

MPP 架构在 OLAP 数据库的运用

MPP 架构&#xff1a; MPP 架构的产品&#xff1a; Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务&#xff0c;目前很多大型互联网公司都大规模运行这样的系统&#xff0c;稳定可靠&#xff0c;低成本。…

vscode刷leetcode使用Cookie登录

1、安装插件 打开vscode&#xff0c;选择扩展&#xff0c;搜索leetcode&#xff0c;选择第一个&#xff0c;带有中文力扣字样&#xff0c;安装后重启 2、切换 选择这个小球&#xff0c;切换中文版本&#xff0c;切换后&#xff0c;会显示一个打勾 3、 选择小球旁边的有箭…

ES6 class类的静态方法static有什么用

在项目中&#xff0c;工具类的封装经常使用静态方法。 // amap.jsimport AMapLoader from amap/amap-jsapi-loader; import { promiseLock } from triascloud/utils; /*** 高德地图初始化工具*/ class AMapHelper {static getAMap window.AMap? window.AMap: promiseLock(AM…

c语言:通讯录管理系统(动态分配内存版)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…