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-resources
或 finally
块进行清理操作。
示例:
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()
:用于线程同步控制。