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

news2024/11/19 6:19:45

目录

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@1b6d3586
        System.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()进行重写
    @Override
    public 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) 方法
    @Override
    public 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)
    @Override
    public 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;
    }

    @Override
    protected 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);
        //输出结果为 121

        Integer 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);
        //输出 24

        String 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.coloradmin.cn/o/1081828.html

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

相关文章

html css实战之学成在线项目

html css实战之学成在线项目 项目链接&#xff1a;https://download.csdn.net/download/weixin_39451323/88416213 效果图&#xff1a;

4年测试经验,面试却突破不了20K,真是太卷了····

先说一个插曲&#xff1a;上个月我有同学在深圳被裁员了&#xff0c;和我一样都是软件测试&#xff0c;不过他是平安外包&#xff0c;所以整个组都撤了&#xff0c;他工资和我差不多都是14K。 现在IT互联网已经比较寒冬&#xff0c;特别是软件测试&#xff0c;裁员先裁测试&am…

【技术追踪】SAM(Segment Anything Model)代码解析与结构绘制之Prompt Encoder

论文&#xff1a;Segment Anything   代码&#xff1a;https://github.com/facebookresearch/segment-anything 上一篇&#xff1a;【技术追踪】SAM&#xff08;Segment Anything Model&#xff09;代码解析与结构绘制之Image Encoder 本篇示例依然采用上一篇的狗狗图像运行代…

深度学习笔记之优化算法(八)Adam算法的简单认识

深度学习笔记之优化算法——Adam算法的简单认识 引言回顾&#xff1a;基于Nesterov动量的RMSProp算法Adam算法的简单认识一阶矩、二阶矩修正偏差的功能Adam的算法过程描述Adam示例代码 引言 上一节介绍了基于 Nesterov \text{Nesterov} Nesterov动量与 RMSProp \text{RMSProp}…

文字与视频结合效果

效果展示 CSS 知识点 mix-blend-mode 属性的运用 实现整体页面布局 <section class"sec"><video autoplay muted loop><source src"./video.mp4" type"video/mp4" /></video><h2>Run</h2><!-- 用于切…

【Java 进阶篇】JavaScript 与 HTML 的结合方式

JavaScript是一种广泛应用于Web开发中的脚本语言&#xff0c;它与HTML&#xff08;Hypertext Markup Language&#xff09;结合使用&#xff0c;使开发人员能够创建交互式和动态的网页。在这篇博客中&#xff0c;我们将深入探讨JavaScript与HTML的结合方式&#xff0c;包括如何…

Web知识:markupsafe.escape() 函数的作用

1、markupsafe.escape() 函数是 MarkupSafe 库中的一个函数&#xff0c;它的作用是对字符串进行 HTML 转义&#xff0c;以防止在 HTML 文档中引起意外的解析结果或安全漏洞。 2、在 Web 开发中&#xff0c;如果用户提供的数据直接插入到 HTML 页面中&#xff0c;而没有经过转义…

SpringBoot调用存储过程(入参,返参)(亲测有效!!!)

存储过程和函数是有区别的&#xff01;&#xff01;&#xff01; 创建函数&#xff0c;只是演示&#xff0c;以下函数不完整&#xff01;&#xff01;&#xff01;(只是看P_xxx参数) CREATE OR REPLACE PROCEDURE SP_TICKET_CHECKE_ONLINE_TEST (p_transcode IN OUT VA…

Java反射获取抽象类方法属性问题讲解

Java反射获取抽象类方法属性问题讲解 结论一、案例准备二、测试方法&#xff1a;使用反射获取抽象类私有方法和私有属性具体操作&#xff08;获取私有方法&#xff09;具体操作&#xff08;获取私有属性&#xff09; 结论 Java 通过反射可以获得抽象类的任何修饰符&#xff08…

Vue2 Watch的语法

Watch语法 一、监听普通数据类型&#xff08;1&#xff09;把要监听的msg值看作方法名&#xff0c;来进行监听。&#xff08;2&#xff09;把要监听的msg值看作对象&#xff0c;利用hanler方法来进行监听 二、监听对象&#xff1a;&#xff08;1&#xff09;监听对象需要用到深…

LeetCode【300】最长递增子序列

题目&#xff1a; 思路&#xff1a; 通常来说&#xff0c;子序列不要求连续&#xff0c;而子数组或子字符串必须连续&#xff1b;对于子序列问题&#xff0c;第一种动态规划方法是&#xff0c;定义 dp 数组&#xff0c;其中 dp[i] 表示以 i 结尾的子序列的性质。在处理好每个…

1808_ChibiOS基本的架构介绍

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 简单看了一下ChibiOS的架构介绍&#xff0c;感觉这种OS以及组件非常适合快速构建一个应用。这里做一个简单的资料整理。。 1. 不同于其他的OS&#…

TCP/IP(九)TCP的连接管理(六)TIME_WAIT状态探究

一 TIME_WAIT探究 要明确TIME_WAIT状态在tcp四次挥手的阶段 ① 为什么 TIME_WAIT 等待的时间是 2MSL? 背景&#xff1a; 客户端在收到服务端第三次FIN挥手后,就会进入TIME_WAIT 状态,开启时长为2MSL的定时器1、MSL 是 Maximum Segment Lifetime 报文最大生存时间2、2MSL…

4.(vue3.x+vite)style动态绑定的方式

前端技术社区总目录(订阅之前请先查看该博客) 效果浏览 代码如下: <template><div><div :style="{

改造Vue-admin-template登录

这是是将Vue-admin-template改为登录自己的&#xff0c;拿自己的数据&#xff0c;原作者是gitee花裤衩或者github devServer: {proxy: {/dev-api: {target: http://localhost:8035,changeOrigin: true,pathRewrite: {^/dev-api: }}} }, main.js如下 import Vue from vueimpor…

VMware虚拟机安装Linux教程(图文超详细)

1.安装VMware 官方正版VMware下载地址 https://www.vmware.com/ 双击安装 以上就是VMware在安装时的每一步操作&#xff0c;基本上就是点击 "下一步" 一直进行安装。 2.安装Linux VMware虚拟机安装完毕之后&#xff0c;我们就可以打开VMware&#xff0c;并在上面来…

validator库的使用详解

TOC 基本使用 前言 在做API开发时&#xff0c;需要对请求参数的校验&#xff0c;防止用户的恶意请求。例如日期格式&#xff0c;用户年龄&#xff0c;性别等必须是正常的值&#xff0c;不能随意设置。以前会使用大量的if判断参数的值是否符合规范&#xff0c;现在可以使用val…

电脑如何查看是否支持虚拟化及如何开启虚拟化

什么是虚拟化? Intel Virtualization Technology就是以前众所周知的“Vanderpool”技术&#xff08;简称VT&#xff0c;中文译为虚拟化技术&#xff09;&#xff0c;这种技术可以让一个CPU工作起来就像多个CPU并行运行&#xff0c;从而使得在一部电脑内同时运行多个操作系统成…

rabbitmq-----黑马资料

rabbit的三种发送订阅模式 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送时丢失&#xff1a;生产者发送的消息未送达exchange消息到达exchange后未到达queueMQ…

使用Python进行食品配送时间预测

一般的食品配送服务需要显示交付订单所需的准确时间&#xff0c;以保持与客户的透明度。这些公司使用机器学习算法来预测食品配送时间&#xff0c;基于配送合作伙伴过去在相同距离上花费的时间。 食品配送时间预测 为了实时预测食物的交付时间&#xff0c;我们需要计算食物准…