Object类——《Java核心技术卷一》

Object只能持有各种对象的值,但是不能进行操作。如果要对Object持有的对象进行操作,还需要将该对象强制转换为原来的类型。

        Object obj = new Employee("Harry Hacker", 35000);
        Employee e = (Employee) obj;

1. equals()方法

   在Object类中,若两个对象具有相同的引用,则返回true。但在我们自己的类中,我们可以编写equals方法,即使两个对象不具有相同的引用,如果它们的实例域(即数据)都相等,则返回true。
     在继承中,可能会造成一个数据的显式和隐式参数不属于同一个类。
  若有一个Employee对象e和一个Manager对象m,若在类中使用了instanceof,则e.equals(m)和m.equals(e)结果不同。所以,如果超类子类的类并不重要,只要实例域相等即可,那使用instanceof判断类别就可以。如果是否是同一个类很重要,最好使用getClass判断类别。

如何编写equals方法:

  •  显式参数命名为otherObject
  •  检测this与otherObject是否引用同一个对象(==)
  •  检测otherObject是否为null,若是,返回false
  •  比较this与otherObject是否属于同一个类。若每个子类的equals不尽相同,可以使用getClass判断。若都相同,使用instanceof即可。
  • 将otherObject转换为相应类类型,如ClassName other = (ClassName) otherObject

2. hashcode()方法

   如果重新定义 equals方法, 就必须重新定义 hashCode 方法,以便用户可以将对象插入到散列表中。如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值。

   hashCode 方法定义在 Object 类中, 因此每个对象都有一个默认的散列码。但在其他基本类中,基本类都会自己定义各自的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;
    }

   在这之中,特别要注意的是StringBuilder类。字符串的散列码是由内容计算得出的,而字符串缓冲StringBuilder中没有hashcode方法,它的散列码是由Object 类的默认 hashCode 方法导出的对象存储地址。所以,对于两个内容相同的String字符串,它们的hashcode是相同的。但两个内容相同的StringBuilder字符串的hashcode并不相同。

 需要组合多个散列值时, 可以调用 Object.hash 并提供多个参数。这个方法会对各个参数调用 Objects.hashCode, 并组合这些散列值。

//hash方法的原始定义
    public static int hash(Object... values) {
        return Arrays.hashCode(values);
    }

//hash方法的使用
    public int hashCode(){
        return Objects,hash(name, salary, hireDay);
    } 

3. toString()方法

只要对象与一个字符串通过操作符“ +” 连接起来,Java 编译就会自动地调用 toString方法,以便获得这个对象的字符串描述。

    Point p = new Point(10, 20);
    String message = "The current position is " + p;
// automatically invokes p.toString()

猜你喜欢

转载自www.cnblogs.com/chanonnn/p/12938271.html
今日推荐