java - clone() 方法如何访问对象的字段? ( java )

标签 java reflection clone subclass native-code

我有一个关于 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 aint bString cString 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/

相关文章:

java - 在 Android 上存储和检索值

java - mongo java驱动程序中的getConnectionsPerHost()和getMaxSize()方法有什么区别

java - 支持 IPv6 需要进行哪些更改

java - 如何查找一个类的所有参数及其类型?

javascript - 如何以动态形式迭代每个选择元素

java - 如何使用 Java 从网站检索 URL?

java - 当类名称为字符串时转换为未知类型

reflection - BRDF 通常是如何实现的?

c - Linux克隆 "kills"主线程

java - 不实现可克隆接口(interface)的对象克隆