java Object中toString()和equals()重写的源码分析

#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

当我们输出对象的时候,返回的数值并不是我们想要的

原因分析:

  1. 查看源码:
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()方法,以下为操作步骤:

  1. 在所选类中,alt+insertequals() and hashCode()
  2. 选择模板(Iemplate),选择Intellij Default
  3. 连续点击’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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值