作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下程序
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。
super.clone() 方法将创建一个父类型的新对象(本例中为 Object),其中父类的属性将被浅复制。
当我们在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/
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们
当使用使用 C 风格继承的 C API 时,(利用 C 结构的标准布局),例如 GLib ,我们通常使用 C 风格的转换来向下转换: struct base_object { int x;
我是一名优秀的程序员,十分优秀!