Java中Object的常用方法
1. toString()
toString()
方法返回一个表示该对象的字符串。默认情况下,这个方法返回对象的类名、@"符号以及对象的哈希码的十六进制表示。通常情况下,会覆盖这个方法以提供更有意义的字符串表示。
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()
方法用于比较两个对象是否相等。默认实现仅检查对象引用是否相同。通常会重写这个方法来实现更具体的逻辑,比如根据对象的某些属性来判断。
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()
方法。
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()
方法。
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
对象。
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()
则让当前持有该对象锁的线程进入等待状态。
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();
}
}