概述
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
- 对称性:对于任何引用
x
、y
,当x.equals(y)
返回true
时,y.equals(x)
也应该返回true - 传递性:对于任何引用
x
、y
、z
,当x.equals(y)
返回true
时,当y.equals(z)
返回true
时,x.equals(z)
也应该返回true
- 一致性:如果
x
和y
引用对象没有发生改变,反复调用equals
方法的结果应该时一样的 - 对于任何非空引用
x
,调用x.equals(null)
都应该返回false
如何才能书写出完美的equals
方法呢
- 检测
this
和obj
是否引用同一地址 - 检测需要比较值
obj
是否为null
- 比较
this
和obj
是否属于同一个类,使用object
类中的getClass()
方法进行比较 - 如果允许比较的值是
this
的子类对象,那么可以使用instanceof
关键字进行检测 - 对各个字段进行用户自定义的类型检测
@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()
方法
唤醒所有正在休眠状态的线程。