概述

Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。
如果没有明确指出超类,Object被默认是这个类的超类。

Object的用途

可以使用Object类型的变量引用任何类型的变量

public void demo() {
	Object object = new Employee();
}

当然Object类型变量只能作为各种值的持有者,如果想要对其中的内容进行操作,还是需要知道这个对象的原始数据类型,并做相应的类型转换。

Object常用的方法

equals()方法

Object类中的equals方法用于检测当前对象与指定对象是否为同一对象。
在原始的objec类中equals方法在比较基本数据类型时比较数值相等,当比较引用数据类型时,则是比较内存地址是否一致。
在我们自定义的类中直接使用Object类中的equals方法可能无法满足我们的需求,所以我们需要重写equals方法。

重写equals方法需要满足下面几个要求

  • 自反性:对于任何非空引用x,x.equals(x)应该返回true
  • 对称性:对于任何引用xy,当x.equals(y)返回true时,y.equals(x)也应该返回true
  • 传递性:对于任何引用xyz,当x.equals(y)返回true时,当y.equals(z)返回true时,x.equals(z)也应该返回true
  • 一致性:如果xy引用对象没有发生改变,反复调用equals方法的结果应该时一样的
  • 对于任何非空引用x,调用x.equals(null)都应该返回false

如何才能书写出完美的equals方法呢

  1. 检测thisobj是否引用同一地址
  2. 检测需要比较值obj是否为null
  3. 比较thisobj是否属于同一个类,使用object类中的getClass()方法进行比较
  4. 如果允许比较的值是this的子类对象,那么可以使用instanceof关键字进行检测
  5. 对各个字段进行用户自定义的类型检测
@Override
public boolean equals(Object obj) {
	if (this == obj) {
		return true;
	}
	if (obj == null) {
		return false;
	}
	if (obj.getClass() != getClass()) {
		return false;
	}
	if (!(obj instanceof E)) {
		return false;
	}

	// 用户自定义判断
}

HashCode()方法

散列码(hash code)是由对象导出的一个整数值。散列码是没有规律的。
由于hashCode方法定义在Object类中,如果没有进行重写的话,默认是内存地址的十进制值。

hashCode返回的应该是一个整数,也可以为负数。

Java中有一个这样子的规定,如果equals方法比较后返回true那么他们的hashCode方法返回的哈希码也必须相同,那么我们要做到这一点就需要重写hashCode方法。

重写hashCode方法

import java.util.Objects;

public class Student {
	private int id;
	private String name;
	private int mathScore;

	@Override
	public int hashCode() {
		return Object.hash(id, name, mathSocre);
	}
	
}

toString()方法

它用于返回表示对象值的字符串,如果我们没有重写这个方法,默认输出包名+类名+@+内存地址的十六进制。

在打印数组是我们应该用工具类中的方法Arrays.toString()方法去输出数组

getClass()方法

返回包含对象信息的类信息

wait()方法

将线程进入休眠状态,此方法不会使线程阻塞,会释放当前锁。

notify() 方法

随机唤醒一个正在休眠状态的线程。

notifyAll()方法

唤醒所有正在休眠状态的线程。