Object
类的成员方法
方法名 | 访问修饰符 | 描述 |
---|---|---|
public Object() | 构造方法 | 默认构造方法,创建一个 Object 类的实例。 |
public boolean equals(Object obj) | 公共方法 | 比较两个对象是否相等。 |
protected void finalize() | 受保护方法 | 垃圾回收器回收对象前调用此方法(已废弃,自Java 9开始)。 |
public final Class<?> getClass() | 公共方法 | 返回对象的运行时类。 |
public int hashCode() | 公共方法 | 返回对象的哈希码。 |
public String toString() | 公共方法 | 返回对象的字符串表示。 |
protected Object clone() | 受保护方法 | 创建并返回对象的副本。 |
public final void notify() | 公共方法 | 唤醒在此对象监视器上等待的单个线程。 |
public final void notifyAll() | 公共方法 | 唤醒在此对象监视器上等待的所有线程。 |
public final void wait(long timeout) | 公共方法 | 导致当前线程等待,直到被唤醒或超时。 |
public final void wait(long timeout, int nanos) | 公共方法 | 与 wait(long timeout) 类似,提供纳秒级精度。 |
public final void wait() | 公共方法 | 导致当前线程等待,直到被唤醒。 |
public String toString()
1. 默认实现
在 Object
类中,toString()
方法的默认实现返回一个字符串,该字符串由以下三部分组成:
- 类名:返回对象的类名,即
getClass().getName()
的结果。 - ‘@’ 符号:用于分隔类名和哈希码。
- 哈希码:返回对象的哈希码,即
Integer.toHexString(hashCode())
的结果。
因此,默认情况下,toString()
方法的返回值格式如下:
ClassName@HashCode
例如,如果你有一个 Person
类的实例,并且没有覆盖 toString()
方法,那么调用 toString()
可能会返回类似 "Person@6f94fa3e"
这样的字符串。
2. 覆盖 toString()
方法
由于默认的 toString()
方法通常只提供了很少的信息,因此通常建议在自定义类中覆盖此方法,以便提供更有用的信息。这可以通过在类中添加以下方法实现:
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
在这个例子中,Person
类有两个属性:name
和 age
。覆盖后的 toString()
方法返回一个包含这些属性的字符串,例如 "Person[name=John, age=30]"
。
protected Object clone()
1. 访问修饰符
clone()
方法被声明为 protected
,这意味着它只能在定义它的类内部,或者通过继承该类的子类中被调用。这意味着你不能直接在一个对象上调用 clone()
方法,除非你在同一个包中,或者你重写了该方法并改变了其访问级别。
2. 默认实现
clone()
方法的默认实现是浅拷贝(shallow copy)。这意味着它创建一个新对象,然后将当前对象的所有字段复制到新对象中。如果字段是基本数据类型,则直接复制其值;如果字段是引用类型,则复制引用,而不是复制引用指向的对象。因此,原始对象和克隆对象将共享相同的引用类型字段。
3. 使用 clone()
方法
要使用 clone()
方法,你必须执行以下步骤:
- 实现
Cloneable
接口:Cloneable
接口是一个标记接口,它没有定义任何方法。它告诉Java虚拟机,这个类可以调用clone()
方法。 - 覆盖
clone()
方法:在子类中,你可以覆盖clone()
方法,以提供对默认实现的访问权限更改,或者实现深拷贝(deep copy)。
以下是一个简单的例子:
public class MyClass implements Cloneable {
private int[] myArray;
// 构造方法、其他方法和属性...
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
MyClass original = new MyClass();
MyClass copy = (MyClass) original.clone();
在这个例子中,MyClass
实现了 Cloneable
接口并覆盖了 clone()
方法。注意,clone()
方法声明抛出了 CloneNotSupportedException
异常,这是 Object
类中 clone()
方法的声明。
4. 浅拷贝与深拷贝
如前所述,clone()
方法的默认实现是浅拷贝。如果你需要深拷贝,即复制对象及其所有引用类型的字段指向的对象,你需要在覆盖的 clone()
方法中手动复制这些对象。
@Override
public Object clone() throws CloneNotSupportedException {
MyClass cloned = (MyClass) super.clone();
cloned.myArray = new int[myArray.length];
System.arraycopy(myArray, 0, cloned.myArray, 0, myArray.length);
return cloned;
}
在这个例子中,clone()
方法首先调用 super.clone()
来创建一个浅拷贝。然后,它创建一个新的数组,并将原始数组的元素复制到新数组中,从而实现了对 myArray
字段的深拷贝。