进阶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.hqwc.cn/news/131984.html

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

相关文章

C++标准模板(STL)- 类型支持 (数值极限,round_style,is_iec559,is_bounded)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

服务器上部署python脚本

1.查看服务器上的python是否自带&#xff0c;一般都自带 2.将本地脚本上传到服务器 3.直接运行一下脚本看报什么错误 代码错误&#xff0c; 将f删除后报别的错误 上面是未安装依赖的错误。我们安装一下依赖 下面是编码的解决 #!/usr/bin/python # -*- coding: utf-8 -*- 先把…

Java项目调用Python脚本(基于idea)

前期准备 1.首先需要在本地环境中安装配置python环境 Python(含PyCharm及配置)下载安装以及简单使用(Idea) 博主本次使用python版本为py3.7.3 2.idea安装python插件 位置&#xff1a;File->Settings->Plugins->python->安装后重启即可 3.引入jython依赖 &l…

mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件

mac 版hadoop3.2.4或其他版本 Unable to load native-hadoop library 缺失文件 Native 包报错缺失&#xff1a; 1. hadoop-3.2.4/lib/native里加*.dylib 2. hadoop-3.2.4/etc/hadoop/hadoop-env.sh 加或修改 export HADOOP_OPTS"-Djava.library.path/Users/lvan/Documen…

虚拟机软件Parallels Desktop 19 mac功能介绍

Parallels Desktop 19 mac是一款虚拟机软件&#xff0c;它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面&#xff0c;使用户可以轻松创建、配置和管理虚拟机。 PD19虚拟机软件具有快速启动和关闭虚拟机的能力&#xff0c;让…

【Unity ShaderGraph】| 给模型添加一个 边缘光效果 实战

前言 【Unity ShaderGraph】| 边缘光效果实战一、效果展示二、简易边缘光效果三、进阶边缘光效果四、应用实例 前言 本文将使用Unity ShaderGraph制作一个模型边缘光的效果&#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【U…

iPhone手机记笔记工具选择用哪个

iPhone手机大家应该都比较熟悉&#xff0c;其使用性能是比较流畅的&#xff0c;在iPhone手机上记录笔记可以帮助大家快速地进行总结工作、记录工作内容等&#xff0c;在iPhone手机上记笔记工具选择用哪个呢&#xff1f; 可以在iPhone手机上使用的笔记工具是比较多的&#xff0…

Android绑定式服务

Github:https://github.com/MADMAX110/Odometer 启动式服务对于后台操作很合适&#xff0c;不过需要一个更有交互性的服务。 接下来构建这样一个应用&#xff1a; 1、创建一个绑定式服务的基本版本&#xff0c;名为OdometerService 我们要为它增加一个方法getDistance()&#x…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持本地图片上传与回显的功能实现(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 排除路径&#xff0c;增加avatar图片 # security配置 security:# 排除路径excludes:# 静态资源- /*.html…

上海亚商投顾:沪指冲高回落 医药、芯片股全天领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日小幅反弹&#xff0c;创业板指盘中涨超1.6%&#xff0c;午后涨幅有所收窄。医药医疗股全线走强&#…

养老院一键报警的重要性和应用

盾王养老院一键报警的重要性和应用 首先&#xff0c;一键报警装置能够极大地提高养老院的安全性。老年人由于身体机能下降&#xff0c;往往容易成为犯罪分子的目标。而一键报警装置能够在遇到危险情况时&#xff0c;立即向养老院管理人员发送警报&#xff0c;从而及时采取措施…

学信息系统项目管理师第4版系列24_整合管理

1. PMBOK 1.1. 自1987年以来&#xff0c;PMBOK-直是基于过程的项目管理标准的重要代表 1.1.1. 基于过程的方法是项目管理的基石 1.2. 从2021年开始&#xff0c;第7版PMBOK采用了基于原则的标准&#xff0c;其中包含了 12个项目管理基本原则&#xff0c;这些基本原则为有效的…