Object类的常见方法有哪些

1.是什么

        在Java中,Object类是所有类的超类(除了Object类本身没有超类)。这意味着所有的Java类都直接或间接地继承自Object类。Object类提供了一些基本的方法,这些方法可以被所有Java对象使用。


1. equals(Object obj)

作用:

        比较两个对象是否“相等”。默认情况下,equals() 方法比较的是对象的内存地址(即引用是否相同),但可以在子类中重写它来实现更复杂的比较逻辑(如比较对象的内容)。

示例:

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true; // 比较引用
        if (obj == null || getClass() != obj.getClass()) return false; // 比较类型
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name); // 比较内容
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("John", 25);
        Person p2 = new Person("John", 25);
        System.out.println(p1.equals(p2)); // 输出:true
    }
}

2. hashCode()

作用:

    hashCode() 方法返回对象的哈希值,通常与 equals() 方法一起使用。在重写 equals() 的同时,也应重写 hashCode(),以确保相等的对象有相同的哈希值。默认的 hashCode() 方法会基于对象的内存地址生成哈希值。

示例:

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("John", 25);
        Person p2 = new Person("John", 25);
        System.out.println(p1.hashCode() == p2.hashCode()); // 输出:true
    }
}

3. toString()

作用:

    toString() 方法用于返回对象的字符串表示。默认情况下,它返回的是类名加上对象的哈希码。但一般都会重写它,以便打印对象时显示更有意义的信息。

示例:

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person("John", 25);
        System.out.println(p.toString()); // 输出:Person{name='John', age=25}
    }
}

4. clone()

作用:

    clone() 方法用于创建并返回当前对象的一个浅拷贝。默认的 clone() 方法会拷贝基本数据类型,而对引用类型只会复制引用地址。为了使用 clone(),类必须实现 Cloneable 接口,并重写 clone() 方法,否则会抛出 CloneNotSupportedException

示例:

class Person implements Cloneable {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("John", 25);
        Person p2 = (Person) p1.clone();
        System.out.println(p1 == p2); // 输出:false
        System.out.println(p1.equals(p2)); // 输出:true
    }
}

5. getClass()

作用:

    getClass() 方法返回对象的运行时类。这个方法非常有用,特别是在需要确定对象的类型时。

示例:

public class Main {
    public static void main(String[] args) {
        Person p = new Person("John", 25);
        System.out.println(p.getClass().getName()); // 输出:Person
    }
}

6. finalize()

作用:

    finalize() 方法在对象被垃圾回收之前调用,用于释放资源或执行清理工作。然而,这个方法已被弃用,并且不建议依赖它进行资源释放,推荐使用 try-with-resourcesfinally 块进行清理操作。

示例:

class Resource {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("Resource is being garbage collected");
        super.finalize();
    }
}

public class Main {
    public static void main(String[] args) {
        Resource r = new Resource();
        r = null;
        System.gc(); // 触发垃圾回收,调用 finalize 方法
    }
}

7. wait(), notify(), notifyAll()

作用:

        这三个方法用于线程间通信。wait() 让当前线程进入等待状态,直到其他线程调用 notify()notifyAll()notify() 唤醒等待的某个线程,而 notifyAll() 唤醒所有等待线程。

示例:

class SharedResource {
    synchronized void waitForSignal() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " is waiting.");
        wait();
        System.out.println(Thread.currentThread().getName() + " has been notified.");
    }

    synchronized void sendSignal() {
        notify();
        System.out.println(Thread.currentThread().getName() + " sent a signal.");
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        SharedResource resource = new SharedResource();
        
        new Thread(() -> {
            try {
                resource.waitForSignal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "Thread1").start();

        Thread.sleep(1000); // 让线程1进入等待

        new Thread(resource::sendSignal, "Thread2").start();
    }
}

总结:

  • equals()hashCode():用于比较对象是否相等,常用于哈希表类数据结构中(如 HashMap)。
  • toString():提供对象的字符串表示,通常重写以使输出更友好。
  • clone():创建对象的浅拷贝。
  • getClass():返回对象的运行时类型。
  • finalize():在垃圾回收之前执行,已不推荐使用。
  • wait(), notify(), notifyAll():用于线程同步控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值