Object类的简介

java.lang.Object

  • java.lang包在使用的时候无需显示导入,编译的时候由编译器自动导入
  • Object类是所有类的超类,是java中唯一没有父类的类,如果没有明确地指出超类,Object就被认为是这个类的超类
  • 在Java中,只有基本类型不是对象

Object类的方法

equals方法()

  • Object类中的equals方法用于监测一个对象是否等于另外一个对象。但是,如果单单是在Object类当中,这个方法仅仅只判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的
  • 为什么每个类要重写equals的原因:然而,对于多数类来说,这种判断没有太大的意义。例如两个Employee对象,需要判断的是两个对象的name、time和salary是否相等,而不仅仅只是判断两个对象是否具有相同的引用
  • 在类中equals的重写:
class Employee
{
    String name;
    double salary;
    Date hireDay;
    ...
    //此处用Object类接收所有的类型
    public boolean equals(Object otherObject){
        //1.判断是否是相同的引用
        if(this == otherObject) return true;
        //2.判断对象是否为空
        if(otherObject == null) return false;
        //3.判断是否是同一个类
        if(getClass() != otherObject.getClass()) return false;

        //4.做类型转换
        Employee other = (Employee) otherObject;
        //5.检测各个域是否相等
        return name.equals(other.name)
        && salary == other.salary
        && hireDay.equals(other.hireDay);
    }
    ...
}
  • 为什么要用getClass()而不用instanceof
  1. 例如有一个引用对象Employee e,和一个对象Manager m,并且两个对象具有相同的姓名、薪水和雇佣日期。现在判断 e.equals(m),当代码执行到 m instanceof Employee 的时候,返回的是true。但是如果判断m.equals(e),e instanceof Manager的时候,返回了false。这违背了Java语言对equals方法的特性要求,自反性:a == b , b == a 。

hashCode()

  • 每个对象都拥有自己的一个散列码,是一个整形值,如果重写了equals方法,就必须重写hashCode方法
  • hashCode的返回值必须是int,举例说明:
class Employee
{
    public int hashCode()
    {
        return 7*name.hashCode()+11*new Double(salary).hashCode
        +13*hireDay.hashCode();
    }
}
  • 为什么重写了equals就必须重写hashCode:感觉不错的解答,总结的就是,如果重写了equals而不重写hashCode可能导致两个对象通过equals方法判断为相等,但是却具有不同的散列值

toString()

  • toString()方法,它用于返回表示对象值的字符串。例如,Point类的toString方法将返回下面这样的字符串:java.awt.Point[x=10,y=20]
  • 随处可见toString方法的主要原因是:只要对象与一个字符串通过操作符“+”连接起来,Java编译器就会自动地调用toString方法,以便获得这个对象的字符串描述
  • 强烈建议为自定义的每一个类增加toString方法。这样做不仅自己受益,而且所有使用这个类的程序员也会从这个日志记录支持中受益匪浅