我有一个关于 Java 中的 clone() 方法的问题。首先,我确实知道克隆方法已被破坏以及其他所有内容,但我们正在学校学习这个主题,我想牢牢掌握它(即使它可能不是最有效的做事方式)。
假设我处于这样的情况:
public class A implements Cloneable {
private int a;
private int b;
// constructors, methods, etc.
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone()
}
}
public class B extends A {
private String c;
private String d;
// constructors and all the rest
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone()
}
}
现在,如果在我的 main() 中我有类似的内容:
B test1 = new B();
B test2 = (B) test1.clone();
根据经验,我知道 clone()
方法会复制 test1 的所有值;事实上,我可以访问和修改 int a
、int b
、String c
和 String d
,这要归功于适当的获取/设置方法。
我真正不明白的是为什么这一切都会这样。我的意思是:当我从 B 运行 clone()
时,它会调用 A 中的 clone()
,而 A 又会调用 Object 的 clone ()
返回一个对象,该对象是 test1 的浅拷贝。然后,该对象被返回到 A 的 clone()
,A 的 clone()
将其返回给 B 的 clone()
,B 的 clone()
返回该对象。
现在,这个复制发生在哪里以及复制了什么? A 和 B 的 clone()
实际上没有执行任何操作(或者从技术上讲没有执行任何复制)。 B 的方法只是调用 A 的方法,而 A 的方法又调用 Object 的方法。 first answer to this question我昨天发现强化了我对 A 和 B 的 clone()
方法的必要性的信念,指出在这种特定情况下(恰好与我的相同),B 的 clone()
甚至根本没有必要。
很公平,这意味着 Object 的 clone()
是执行所有复制的函数。现在的问题是:Object 的 clone()
如何查看所有必需的字段?
我谦虚地假设这是因为 Object 是 B 的父类(super class),但这种想法并不成立。事实上,A 也是 B 的父类(super class),但如果不是我在 B 中放入 get/set 方法,我就无法访问 B 的私有(private)字段。而 Object 的 clone()
肯定不会。不能基于我的获取/设置方法工作。
- 这里是否有我遗漏的东西,或者我只是想理解一些我无法理解的东西?
- Object 中的
clone()
方法是某种“特殊”方法还是什么? - 从现在开始,我可以将对象的
clone()
制作对象所有字段的浅拷贝视为公理吗? (它们是私有(private)的或仅在子类/父类(super class)或其他任何东西中可见......)
(如果可以的话,请提供引用资料。并不是我不相信你,只是我已经查遍了所有的教科书和网上,我真的很想知道下次我该去哪里找有这样的问题!;))
最佳答案
clone() 的 javadoc 解释了 Object.clone() 的作用:
The method clone for class Object performs a specific cloning operation. First, if the class of this object does not implement the interface Cloneable, then a CloneNotSupportedException is thrown. Note that all arrays are considered to implement the interface Cloneable. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.
clone()
方法是一个 native 方法(只需查看 the sources )。它由 JVM 以 native 代码实现,当然,JVM 可以访问被克隆对象的所有状态。请注意,即使使用反射的 Java 代码也可以访问任何对象的所有状态,甚至是私有(private)状态。
关于java - clone() 方法如何访问对象的字段? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395076/