Object的成员方法

 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 字段的深拷贝。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值