Object的方法与及工具类的源码与重写解析

今天学到Object的方法与其工具类,我就说说它们的默认与重写过后的区别

equals ()与toStirng()方法

文采不好,还是直接上代码吧

首先看equals ()默认中的源码

public boolean equals(Object obj) {
        return (this == obj);
    }
//没有重写的方法,里面比较是两个值的地址 ,this是指当前调用者。

toStirng中的源码

  public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
//默认toString方法,  输出是 类全名  包名+类名 +@ 哈希地址

代码案例

/*
  * Object  equals ()  方法
 *  默认是 比较两个对象的地址
 *  重写后  比较两个对象的内容
 *  Object  toString () 方法
 *  默认输出   类全名  包名+类名 +@ 哈希地址
 *  重写后    输出的是 类名 + 对象的内容,直接输出是对象的内容,里面都有重写toString()方法
 * */
public class Test {
    public static void main(String[] args) {
        Student1 s1 = new Student1("小明", 12);
        Student1 s2 = new Student1("小明", 12);
        boolean b = s1.equals(s2);   //没有重写输出 false,比较地址值
//     重写是比较两地址的内容
        System.out.println(b);
//        没有重写toString方法  输出 com.itheima.keshanglianxi.Student1@73035e27
//        重写后是 对象的类名+ 对象的内容
        System.out.println(s1);


    }
}

结果是

true
Student1{name='小明', age=12}

equals方法重写的解析

public class Student1 {
    private String name;
    private int age;

    public Student1() {
    }

    public Student1(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;
    }
//重写方法一般都有  @Override
    @Override
    public boolean equals(Object o) {
//        判断当前对象地址是否相等,相等返回true
        if (this == o) return true;
//         传入的对象o等于null 或者 获取两个字节码是否相等
        if (o == null || getClass() != o.getClass()) return false;
//        o 是属于Object 超类的,需要转换成相同的类型进行比较
        Student1 student1 = (Student1) o;
//        比较两个年龄是否相等
        return age == student1.age &&
//                使用Object的工具类 Objects的equals方法,稍后会介绍Objects类 一般类名后面加s都是工具类
                Objects.equals(name, student1.name);
    }

    @Override
    public String toString() {
//        toString 方法
        return "Student1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Object的方法都可以在idea自动生成,建议每个类都自动重写这两个方法。

Objects是Object的工具类,为大家介绍几方法

/*
* 介绍几个常用Objects常用方法
*   判断a和b是否相同,底层也是依赖equals方法比较,也需重写equals方法
*   boolean  equals(Object a, Object b)
   判断对象obj是否不为null,是返回true,否则false
   static boolean nonNull(Object obj)
*   判断对象obj是否不为null,如果obj为null,则会抛出异常,否则返回对象obj本身
*   static Object requireNonNull(Object obj)
*
* */
public class Test1 {
    public static void main(String[] args) {
//     还是拿刚才的Student类来创造两个对象
        Student1 s1 = new Student1("小花", 23);
        Student1 s2 = new Student1("小花", 23);
//        使用两种不同对比方法来进行测试
        System.out.println(s1.equals(s2));    //结果是 true
        System.out.println(Objects.equals(s1, s2));  // 结果是 true
//       当 s1 为 null,我们再看看结果
        System.out.println("<-------s1=null----------->");
        s1 = null;
        System.out.println(Objects.equals(s1, s2));  //结果是 false
//        System.out.println(s1.equals(s2));    //结果是  输出异常  java.lang.NullPointerException 意思 是空指针异常
//        建议使用Objects的equals方法,可以判断两个对象是否为空,而Object.equals不能判断调用对象是否为空
        System.out.println("<---------->");
//       判断对象是否为空,是空返回true ,否则false
        System.out.println(Objects.isNull(s1)); //结果是true
//       判断对象是否不为空 ,不为空返回true
        System.out.println(Objects.nonNull(s2));  //结束是true
        System.out.println("<---------->");

        //  saveStudent(s1);  结果是java.lang.NullPointerException  空指针异常
        saveSutdent(s2);   //返回对象本身
    }

    //    定义一个静态方法
    public static void saveSutdent(Student1 stu) {
//        判断对象是否为空 是空抛出异常,不是空,返回对象本身,一般用来传递参数,当你传个空参数进来返回异常告诉你
        System.out.println(Objects.requireNonNull(stu));
    }
}

为什么我推荐使用工具类的判断方法呢,我们来看下它的源码

 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
// 它里面增多了判断当前对象是否为空,而不用需要我们使用equals要加上判断条件

本人小白刚开始接触博客,如果有写得不好,望大家提提意见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值