也许我不明白clone()是如何工作的。 返回值不应该等于调用者吗? int[] nums = new int[] {0, 1, 2}; int[] list = nums.clone(); nums.equals(list); //returns false. Why? for (int ket = 0; ket < list.length; ket++) { System.out.println(list[ket] == nums[ket]); //prints out true every time } list == nums //false
我正在阅读有关Java中的克隆,如何制作对象的浅/深副本等。 我想知道为什么我需要在Java中创建对象克隆? 任何实时示例都有助于理解。
假设我有一个int数组,我想修改它。 我知道我不能将新数组分配给作为参数传递的数组: public static void main(String[] args) { int[] temp_array = {1}; method(temp_array); System.out.println(temp_array[0]); // prints 1 } public static void method(int[] n) { n = new int[]{2}; } 虽然我可以修改它: public static void main(String[] args) { int[] temp_array = {1}; method(temp_array); System.out.println(temp_array[0]); // prints 2 } public static void method(int[] n) { n[0] = 2; […]
我正在编写代码来创建一个对象,克隆该对象,然后比较两者。 有问题的对象Octagon是对象GeometricObject的扩展 public class Octagon extends GeometricObject implements Comparable, Cloneable { private double side; public Octagon (double side){ this.side = side; } public Object clone() throws CloneNotSupportedException { Octagon octClone = (Octagon)super.clone(); return octClone; } 在名为Octagon.java的文件中 在另一个,TestOctagon.java,是我的主要方法: public class TestOctagon { public static void main(String[] args) { GeometricObject test = new Octagon(5); //create an Octagon […]
这样做会调用Asub的clone方法吗? 或Asub是否正确克隆? 如果没有,有没有办法通过这种方法推动深度克隆Asub? abstract class Top extends TopMost { protected Object clone() { Object obj = super.clone(); // deep copy and try catch } } abstract class A extends Top { protected Object clone() { Object obj = super.clone(); // deep copy and try catch } } class Asub extends A { protected Object clone() […]
考虑一下 public class Data { private final SomeField[] fields; ….. public SomeField[] getFields() { return map == null ? null : map.clone(); } 安全性 – 方法返回内部数组 直接公开内部数组允许用户修改一些可能至关重要的代码。 返回数组副本更安全。 我知道我们不应该使用clone()来复制对象,而是使用copy constructor复制对象。 但是仍然会复制作为引用的内部对象。 有什么建议的方法可以避免上面的clone() ? 谢谢
我正在研究一个用于保存和调用屏幕状态的系统,这是我第一次搞乱这种东西,所以我不确定最好的方法是什么,但我目前存储所有的“PreviewMonitor”数组列表中的对象(大约40个左右)。 问题在于,当我创建一个名为“allPreviewMonitors”的ArrayList副本时,我最终得到一个ArrayList,其元素随着原始元素的更新而不断变化。 这几乎就像我正在使用原始的ArrayList,事实上,当我创建allPreviewMonitors的副本时,它应该是一个完全不同的ArrayList,其中包含元素的“冻结”版本及其状态。 为什么会发生这种情况? 如果需要我可以显示代码,但我不确定这里是否需要它。
在我的Java项目中,我有一个各种类型的交易者的向量。 这些不同类型的交易者是Trader类的子类。 现在,我有一个方法,以Trader作为参数,并在向量中存储50次左右。 我遇到了问题,因为存储相同的对象50次只是存储同一对象的50个引用 。 我需要存储50 个对象的副本 。 我已经研究过如何实现Clone ,但是我不希望定义一种Trader的程序员不必担心让他们的类可以克隆 。 此外,正如本页所指出的,实现克隆会产生各种问题。 我认为复制构造函数不会起作用,因为如果我在Trader类中定义了一个,它就不会知道它正在复制的Trader的类型,只是制作一个通用的Trader。 我能做什么? 编辑:我不是真的想要制作某个对象的精确副本。 我真正想要做的是在向量中添加一定数量的交易者。 问题是用户需要在参数中指定他想要添加的交易者类型。 这是我想要做的一个例子:(虽然我的语法完全是想象的) public void addTraders(*traderType*) { tradervect.add(new *traderType*()) } 我怎样才能在Java中实现这样的目标?
我不明白克隆自定义对象的机制。 例如: public class Main{ public static void main(String [] args) { Person person = new Person(); person.setFname(“Bill”); person.setLname(“Hook”); Person cloned = (Person)person.clone(); System.out.println(cloned.getFname() + ” ” + cloned.getLname()); } } class Person implements Cloneable{ private String fname; private String lname; public Object clone() { Person person = new Person(); person.setFname(this.fname); person.setLname(this.lname); return person; } […]
Object上的clone方法创建了一个对象的精确副本,声明为: protected native Object clone() throws CloneNotSupportedException; 为什么它是native ?