螺竹编程
发布于 2024-05-04 / 3 阅读
0

Java面向对象:Object类

Object类介绍

Java中的Object类是所有类的根类,其他所有类都直接或间接地继承自它。Object类中包含了一些基本的方法和属性,可以供所有子类继承和使用。下面介绍一些Object类中比较重要的方法和属性:

  1. equals(Object obj)方法:用于判断两个对象是否相等。默认情况下,equals方法比较的是对象的地址,即判断两个对象是否是同一个对象。子类可以重写equals方法,实现自己的相等判断逻辑。

  2. hashCode()方法:返回当前对象的哈希码。哈希码是一种整数值,可以用于快速比较两个对象是否相等。如果两个对象equals方法返回true,则它们的哈希码必须相等。因此,如果重写了equals方法,也需要同时重写hashCode方法。

  3. toString()方法:返回当前对象的字符串表示。如果没有重写该方法,该方法返回一个字符串,包含对象的类名和哈希码。

  4. getClass()方法:返回当前对象所属的类对象。

  5. wait()、notify()、notifyAll()方法:用于线程间的通信,通过这些方法可以实现线程的等待和唤醒。

  6. 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方法的一般步骤:

  1. 检查传入的对象是否为null,如果是,返回false。

  2. 检查传入的对象是否和当前对象是同一个引用,如果是,返回true。

  3. 检查传入的对象是否是当前对象的类型,如果不是,返回false。

  4. 将传入的对象转换为与当前对象相同的类型,比较它们的属性值是否相等,如果相等,返回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。