Object类
Object类
Object类介绍
Java中的Object类是所有类的根类,其他所有类都直接或间接地继承自它。Object类中包含了一些基本的方法和属性,可以供所有子类继承和使用。下面介绍一些Object类中比较重要的方法和属性:
- equals(Object obj)方法:用于判断两个对象是否相等。默认情况下,equals方法比较的是对象的地址,即判断两个对象是否是同一个对象。子类可以重写equals方法,实现自己的相等判断逻辑。
- hashCode()方法:返回当前对象的哈希码。哈希码是一种整数值,可以用于快速比较两个对象是否相等。如果两个对象equals方法返回true,则它们的哈希码必须相等。因此,如果重写了equals方法,也需要同时重写hashCode方法。
- toString()方法:返回当前对象的字符串表示。如果没有重写该方法,该方法返回一个字符串,包含对象的类名和哈希码。
- getClass()方法:返回当前对象所属的类对象。
- wait()、notify()、notifyAll()方法:用于线程间的通信,通过这些方法可以实现线程的等待和唤醒。
- clone()方法:用于创建并返回当前对象的副本。该方法会创建一个新的对象,将当前对象的所有属性复制到新对象中,并返回新对象的引用。
除了上述方法外,Object类还包括了finalize()方法、getClassLoader()方法等。由于所有类都继承自Object类,因此可以在所有对象上调用Object类中的方法。对象的属性和方法访问权限是由对象所属的类来决定的,因此子类可以访问父类中的protected和public属性和方法,但不能访问父类中的private属性和方法。
Object类源代码
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}
重写Object的equals方法
在Java中,重写equals方法是为了在比较两个对象时,比较它们的内容而不是它们的引用地址。以下是重写equals方法的一般步骤:
- 检查传入的对象是否为null,如果是,返回false。
- 检查传入的对象是否和当前对象是同一个引用,如果是,返回true。
- 检查传入的对象是否是当前对象的类型,如果不是,返回false。
- 将传入的对象转换为与当前对象相同的类型,比较它们的属性值是否相等,如果相等,返回true,否则返回false。
以下是一个示例代码,演示如何重写equals方法:
public class Person {
private String name;
private int age;
// 构造函数、getters和setters
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person other = (Person) obj;
return this.name.equals(other.name) && this.age == other.age;
}
}
在这个示例代码中,我们首先检查传入的对象是否为null,然后检查传入的对象是否和当前对象是同一个引用,最后将传入的对象转换为Person类型,比较它们的属性是否相等。如果属性相等,返回true,否则返回false。