【Java笔记】Object类的equals()和toString()方法

    技术2022-07-11  83

    Object类的两种常用方法

    一. Object类二. 方法源码三. 案例1.学生类2. toString方法2.1 测试2.2 重写后的toString方法2.3 println()源码的底层逻辑 3. equals方法3.1测试3.2 重写后的equals方法源码(内部逻辑需要了解) 四. 快捷键

    一. Object类

    Object类存在于java.lang包中,它是所有类的父类,所有类对Object类的继承是java默认的。下面给出Object类中最常用的两个方法。

    二. 方法源码

    Object类的equals方法源码 //Object类的equals方法源码 public boolean equals(Object obj) { return (this == obj);//比较地址 } Object类的toString方法源码 //Object类的toString方法源码 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());//输出地址 }

    三. 案例

    一般比较对象是否相等需要重写equals方法,输出内容需要重写toString方法

    1.学生类

    public class Student { private String id; private String name; public Student() {} public Student(String id, String name) { this.id = id; this.name = name; } }

    2. toString方法

    2.1 测试

    重写前 public class ToStringTest { public static void main(String[] args) { Student s=new Student("1","zhang"); //没重写Student类中的toString方法 System.out.println(s);//_2Object.Student@1540e19d } } 重写后 //重写后 System.out.println(s);//Student{id='1', name='zhang'}

    通过查看println()函数源码后发现此函数底层是通过调用toString方法,所以没重写println方法时还是调用的Object类的toString方法,重写了toString方法后,覆盖了Object类toString方法。

    2.2 重写后的toString方法

    @Override public String toString() { return "Student{" + "id='" + id + '\'' + ", name='" + name + '\'' + '}'; }

    2.3 println()源码的底层逻辑

    println源码 // public void println(Object x) { // String s = String.valueOf(x); // synchronized (this) { // print(s); // newLine(); // } // } // // public static String valueOf(Object obj) { // return (obj == null) ? "null" : obj.toString(); // } // // public String toString() { // return getClass().getName() + "@" + Integer.toHexString(hashCode()); // }

    3. equals方法

    3.1测试

    重写前 实例化两个学号与姓名都相同的学生对象后,调用equals方法判断是否相等,输出结果是是false,这样就可以发现如果不重写equals方法,无法比较对象是否相等。 public class EqualsTest { public static void main(String[] args) { Student s1=new Student("1","zhang"); Student s2=new Student("1","zhang"); //比较是否相等 //未重写 System.out.println(s1.equals(s2));//false } } 重写后 在学生类中重写equals方法后,调用equals方法判断是否相等,输出结果是是true。 //重写后 System.out.println(s1.equals(s2));//true

    3.2 重写后的equals方法源码(内部逻辑需要了解)

    @Override public boolean equals(Object o) { /* * this -- s1 * o -- s2 * */ //比较地址是否相同 if (this == o) return true; //判断参数是否是null //判断两个对象是不是来自同一个类(getClass()获得字节码文件) if (o == null || getClass() != o.getClass()) return false; //向下转型 Student student = (Student) o; //判断,内部.equals方法调用的是String类中的equals方法 if (id != null ? !id.equals(student.id) : student.id != null) return false; return name != null ? name.equals(student.name) : student.name == null; }

    四. 快捷键

    查看方法的源码:ctrl+b快速重写方法:alt+insert查看源码成员结构:alt+7
    Processed: 0.011, SQL: 9