今天学到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要加上判断条件
本人小白刚开始接触博客,如果有写得不好,望大家提提意见