Java学习心得之Object类

时间:2022-04-11 16:42:35

一、Object类介绍

Object类在Java里面是一个比较特殊的类,Java中所有类都继承自Object类,是所有类的根基类。

Object中的方法:

  • hashCode()
  • equals(Object obj)
  • clone()
  • toString()
  • notify()
  • notifyAll()
  • wait(long timeout)
  • wait(long timeout, int nanos)
  • wait()
  • finalize()

二、Object类部分方法详解

1.hashCode()

含义:

当你覆写了equals()方法之后,必须也覆写hashCode()方法,反之亦然。

这个方法返回一个整型值,如果两个对象被equals()方法判断为相等,那么它们就应该拥有相同的hash code。

Object类的hashCode() 方法为不同的对象返回不同的值,Object类的hashCode值表示的是对象的地址。

满足条件:

  • 在Java应用的一次执行过程中,如果对象用于equals比较的信息没有被修改,那么同一个对象多次调用hashCode()方法应该返回同一个整型值。
  • 如果equals()判断两个对象相等,那么她们呢的hashCode()方法应该返回同样的值。
  • 并没有强制要求如果equals()判断两个对象不相等,那么它们的hashCode()方法就应该返回不同的值。
2.equals(Object)

含义:
对于Object类的equals()方法来说,它判断调用equals()方法的引用于传进来的引用是否一致,即这两个引用是否指向的是同一个对象。
 public boolean equals(Object obj) {
return (this == obj);
}

当继承Object的类覆写了equals()方法之后,继承类实现了用equals()方法比较两个对象是否相等,才可以说equals()方法与"=="的不同。

特点:
  • 自反性:任何非空引用x,x.equals(x)返回为true
  • 对称性:任何非空引用x和y,x.equals(y)返回true,则y.equals(x)返回true,反之亦然。
  • 传递行:任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true
  • 一致性:任何非空引用x和y,在没有修改x和y的前提下,x.equals(y)的多次调用应该保持一致的结果。
  • 约定:对于任何非空引用x,x.equals(null)返回值为false。
PS:覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。

3.clone()

 protected Object clone()

  throws CloneNotSupportedException

  这个方法比较特殊:

  首先,使用这个方法的类必须实现java.lang.Cloneable接口,否则会抛出CloneNotSupportedException异常。

  Cloneable接口中不包含任何方法,所以实现它时只要在类声明中加上implements语句即可。

  第二个比较特殊的地方在于这个方法是protected修饰的,覆写clone()方法的时候需要写成public,才能让类外部的代码调用。

4.toString()

package cn.galc.test;

public class TestToString {

public static void main(String[] args) {
Dog d = new Dog();
/**
* 如果没有重写toString方法,那么输出来的默认的字符串内容是“类名+哈希编码”,
* 如:dog=cn.galc.test.Dog@150bd4d
* 这里的d就是一个引用类型,打印的时候,这个引用类型d会自动调用toString()方法将自己转换成字符串然后再与字符串”d:=”相连,
* 然后一起被打印出来。d为什么可以自动调用toString()方法呢,Dog类里面也没有声明这个toString()方法。
* 这是因为toString()方法是Object类里面的方法,而所有的类都是从Object类继承下来的,
* Dog类当然也不例外,所以Dog类继承了Object类里面的toString()方法,
* 所以Dog类的对象当然可以直接调用toString()方法了。
* 但是Dog类对继承下来的toString()方法很不满意,
* 因为使用这个继续下来toString()方法将引用对象转换成字符串输出时输出的是一连串令人看不懂的哈希编码。
* 为了使打印出来的信息使得正常人都能看得懂,因此要在Dog类里面把这个继承下来的toString()方法重写,
* 使得调用这个toString()方法将引用对象转换成字符串时打印出来的是一些正常的,能看得懂的信息。
* 在子类重写从父类继承下来的方法时,从父类把要重写的方法的声明直接copy到子类里面来,
* 这样在子类里面重写的时候就不会出错了。
*/
System.out.println("dog="+d);//打印结果:dog=I’m a cool Dog
}
}

class Dog{
/**
* 在这里重写了Object类里面的toString()方法后,
* 引用对象自动调用时调用的就是重写后的toString()方法了,
* 此时打印出来的显示信息就是我们重写toString()方法时要返回的字符串信息了,
* 不再是那些看不懂的哈希编码了。
*/
public String toString() {
return "I’m a cool Dog";
}
}