5.2 Object类,所有类的超类

Object类是所有类的超类。即便你不写extends Object 也是默认继承的。
Java中只有基本类型不是对象,其他全部是对象。

1 equals()方法

所有的类都有equals()方法,因为它是Object里面的方法。

public boolean equals(Object obj) {
        return (this == obj);
}

覆盖equals()方法

public class Employee
{
    ...
    public boolean equals(Object otherObject)
    {
        // 是否相同引用
        if (this == otherObject) return true;
        // 是否没有引用
        if (otherObject == null) return false;
        // 类型是否相同
        if (getClass() != otherObject.getClass())
        return false;
        // 现在知道otherObject是一个非null的Employee类型了
        Employee other = (Employee) otherObject;
        // 具体比较每一个值
        return name.equals(other.name)
            && salary == other.salary
            && hireDay.equals(other.hireDay);
    }
}
class Manager extends Employee
{   
    ...
    public boolean equals(Object otherObject)
    {
        if (!super.equals(otherObject)) return false;
        // super.equals已经检查了是不是相同的类
        Manager other = (Manager) otherObject;
        return bonus == other.bonus;
    }
}

2 相等测试与继承

采用instanceof关键字来替代getClass()会产生一些不符合相等测试的原则。

  1. 自反性,自身比较返回true
  2. 对称性,互相对称调用应该返回相同的值
  3. 传递性,x等于y,y等于z,则x等于z
  4. 一致性,反复调用应得到相同的值,如果指向没有变的话
  5. 对null的测试应该返回false

现在感觉第二条应该有问题啊,为什么一定要对称性呢?多态就不是对称的嘛。其实关键地方还是在于,你想比较的相等到底是想比较什么??确定这个才好进行比较啊。

java.util.Arrays类的方法

  • static boolean equals(type[] a, type[] b)
    比较两个数组是否相等

java.util.Objects类的方法

  • static boolean equals(Object a, Object b)
    如果a和b都是null,返回true,一个是null,返回false,然后返回a.equals(b)

3 hashCode()方法

String类的hashCode()方法

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;
        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

String类的hashCode()方法是不安全的,因为会产生重复的int值啊,不好用。

自己定义hashCode()方法

public class Employee
{
    public int hashCode()
    {
        return 7 * name.hashCode()
            + 11 * new Double(salary).hashCode()
            + 13 * hireDay.hashCode();
    }
    ...
}

优化后

public int hashCode()
{
    return 7 * Objects.hashCode(name)
        + 11 * Double.hashCode(salary)
        + 13 * Objects.hashCode(hireDay);
}

这样也可以

public int hashCode()
{
    return Objects.hash(name, salary, hireDay);
}

注意:如果x.equals(y)返回true,那么x和y应该具有相同的hashCode()值。

java.lang.Object类的方法

  • int hashCode()
    返回内存地址。

java.util.Objects类的方法

  • static int **hash(Object… objects)
    返回多个对象的hashCode值的组合
  • static int hashCode(Object a)
    返回hashCode值,加了null检查

java.util.Arrays
- static int hashCode(type[] a)
计算数组的hashCode值

4 toString()方法

变成文本显示出来而已。
这是Object类的toString()方法。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

注意:System.out.println()内的参数,就是执行toString()方法的。
注意:数组直接用+和字符串相连,也是调用其默认的toString()方法的。如果真想输出数组内容,应该使用Arrays.toString方法,前面说过的。

java.lang.Object

  • Class getClass()
    获得包含对象信息的类对象。
  • boolean equals(Object otherObject)
    比较内存指向是否相等。
  • String toString()
    返回对象值的字符串。

java.lang.Class
- String getName()
获得类名
- Class getSuperclass()
获得父类Class对象信息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值