gpt4 book ai didi

java - 调用 super.clone() 方法时向下转型

转载 作者:行者123 更新时间:2023-12-02 03:26:23 25 4
gpt4 key购买 nike

考虑以下程序

class A implements Cloneable {
String str = null;
public void set(String str)
{
this.str = str;
}

@Override
public A clone()
{
A a = null;
try {
a = (A) super.clone();
if(a.str!=null) {
System.out.println(a.str);
}
else {
System.out.println("null");
}

}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return a;
}
public static void main (String args[])
{
A a = new A();
a.set("1234");
A b = a.clone();
}
}

为什么上面程序的输出是1234而不是null。

由于我的以下理解,我期待 null。

  1. super.clone() 方法将创建一个父类型的新对象(本例中为 Object),其中父类的属性将被浅复制。

  2. 当我们在clone()方法中进行向下转换时,子类中定义的属性将使用其默认值进行初始化,因为这是一个新对象。

但是查看输出后,似乎子类当前实例(this)的属性值被复制到新构造的对象(在调用父类的克隆并向下转型之后)。

有人可以告诉我们当我们沮丧时发生了什么吗?

最佳答案

1234 是正确的结果...让我们看看为什么:

创建一个新的A实例:

A a = new A();

将值设置为A.str

a.set("1234");

克隆

A b = a.clone();

首先,请注意,我们正在使用实例 a 中的 clone() 方法,所以让我们转到那里:

@Override
public A clone()
{
// create a NEW instance, it does not set a to null!!!
// to reference the caller (a.clone in main)
// you must use this keyword i.e: this.str = null
A a = null;
try {
// call Cloneable::clone() method
a = (A) super.clone();

// now a is filled with data of this instance so print 1234
if(a.str!=null) {
System.out.println(a.str);
}
// unused code in this case
else {
System.out.println("null");
}

}
catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// return cloned instance
return a;
}

关于java - 调用 super.clone() 方法时向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com