Java中Object的常用方法

1. toString()

toString() 方法返回一个表示该对象的字符串。默认情况下,这个方法返回对象的类名、@"符号以及对象的哈希码的十六进制表示。通常情况下,会覆盖这个方法以提供更有意义的字符串表示。

java 复制代码
public class Person {
    private String name;
    private int age;

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

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

    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        System.out.println(person.toString()); // 输出 Person{name='Alice', age=30}
    }
}

2. equals(Object obj)

equals() 方法用于比较两个对象是否相等。默认实现仅检查对象引用是否相同。通常会重写这个方法来实现更具体的逻辑,比如根据对象的某些属性来判断。

java 复制代码
public class Person {
    private String name;
    private int age;

    public 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 static void main(String[] args) {
        Person alice1 = new Person("Alice", 30);
        Person alice2 = new Person("Alice", 30);
        System.out.println(alice1.equals(alice2)); // 输出 true
    }
}

3. hashCode()

hashCode() 方法返回一个整数形式的哈希码值。当两个对象根据 equals() 方法比较相等时,它们的 hashCode() 必须也相等。通常,当重写了 equals() 方法时,也应该重写 hashCode() 方法。

java 复制代码
public class Person {
    private String name;
    private int age;

    // ... (构造器和属性省略)

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    // ... (equals 方法省略)
}

// 在 main 方法中测试
System.out.println(alice1.hashCode()); // 输出一个哈希码值
System.out.println(alice2.hashCode()); // 输出相同的哈希码值

4. clone()

clone() 方法创建并返回一个对象的副本。需要注意的是,只有实现了 Cloneable 接口的类才能安全地调用 clone() 方法。

java 复制代码
public class Person implements Cloneable {
    private String name;
    private int age;

    // ... (构造器和属性省略)

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

    public static void main(String[] args) throws CloneNotSupportedException {
        Person alice = new Person("Alice", 30);
        Person clonedAlice = alice.clone();
        System.out.println(clonedAlice == alice); // 输出 false
        System.out.println(clonedAlice.equals(alice)); // 输出 true
    }
}

5. getClass()

getClass() 方法返回代表该对象的类的 Class 对象。

java 复制代码
public class Person {
    // ... (类定义省略)

    public static void main(String[] args) {
        Person alice = new Person("Alice", 30);
        Class<?> clazz = alice.getClass();
        System.out.println(clazz.getName()); // 输出 com.example.Person (假设包名为 com.example)
    }
}

6. notify(), notifyAll(), wait()

这些方法与线程同步相关,用于控制对象的锁。notify() 唤醒正在等待该对象锁的一个线程,notifyAll() 唤醒所有等待该对象锁的线程,而 wait() 则让当前持有该对象锁的线程进入等待状态。

java 复制代码
public class Example {

    public static void main(String[] args) {
        final Object lock = new Object();

        Thread t1 = new Thread(() -> {
            synchronized(lock) {
                try {
                    System.out.println("Thread 1 waiting.");
                    lock.wait(); // 释放锁并等待
                    System.out.println("Thread 1 resumed.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized(lock) {
                System.out.println("Thread 2 notifying.");
                lock.notify(); // 唤醒等待的线程
            }
        });

        t1.start();
        t2.start();
    }
}
相关推荐
Poetinthedusk1 分钟前
C#实现图片统一位深
开发语言·c#
Spring AI学习1 分钟前
Spring AI深度解析(10/50):多模态应用开发实战
java·spring·ai
吴佳浩 Alben17 分钟前
Python入门指南(四)
开发语言·后端·python
一然明月43 分钟前
QT之基础控件
开发语言·qt
一勺-_-1 小时前
mermaid图片如何保存成svg格式
开发语言·javascript·ecmascript
Dargon2882 小时前
实例讲解Simulink的MATLAB Function模块
开发语言·matlab·simulink·mbd软件开发
charlie1145141912 小时前
现代C++嵌入式教程:C++98基础特性:从C到C++的演进(1)
c语言·开发语言·c++·笔记·学习·教程
历程里程碑2 小时前
C++ 18智能指针:告别内存泄漏的利器
开发语言·c++
qq_12498707533 小时前
重庆三峡学院图书资料管理系统设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·spring·毕业设计
大学生资源网3 小时前
java毕业设计之“知语”花卉销售网站的设计与实现源码(源代码+文档)
java·mysql·毕业设计·源码·springboot