#java Object中toString()和equals()重写的源码分析
Object是类层级结构的根,每个类都可以将Object作为超类。所有类都直接或间接地继承该类
构造方法:public Object()
面向对象中,为什么说子类的默认访问的是父类的无参构造?
因为它门的顶级父类只有无参构造
toString()方法
Student s = new Student();
s.setName("你");
s.setAge(30);
System.out.println(s); //com.ithema_01.Student@3f3afe78
System.out.println(s.toString()); //com.ithema_01.Student@3f3afe78
当我们输出对象的时候,返回的数值并不是我们想要的
原因分析:
- 查看源码:
public void print(Object obj) { write(String.valueOf(obj)); }
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
2.分析原因:
在使用print
的时候,自动调用了toString()
方法,最后返回的是 类名哈希值
因为这样子查看并不明显,所以建议所有的类重写toString()
方法
equals()方法
// 创建对象一
Student s1 = new Student();
s1.setName("林某某");
s1.setAge(30);
// 创建对象二
Student s2 = new Student();
s2.setName("林某某");
s2.setAge(30);
//需求:比较两个对象的内容是否相等
System.out.println(s1 == s2); //false 因为 == 比较的是地址,两个对象的地址不相同,所以结果是false
System.out.println(s1.equals(s2)); //false
问题:使用equals()方法并不能比较两个对象的内容是否相等
查看源码:
public boolean equals(Object obj) { // this---s1 obj---s2 return (this == obj); }
所以,我们需要重写equals()方法,以下为操作步骤:
- 在所选类中,
alt+insert
,equals() and hashCode()
- 选择模板(Iemplate),选择
Intellij Default
- 连续点击’next’,最后把hashCode()删除
@Override
public boolean equals(Object o) {
/*
this---s1
o ---s2
*/
// 比较地址是否相同,如果相同,直接返回true
if (this == o) return true;
// 判断参数是否为null
// 判断两个对象是否来自同一个类
if (o == null || getClass() != o.getClass()) return false;
// 向下转型
Student student = (Student) o;
// 比较年龄是否相同
if (age != student.age) return false;
// 比较姓名内容是否相同
return name != null ? name.equals(student.name) : student.name == null;
}