为什么不是';有没有一种简单的方法可以在Java中复制对象?

为什么不是';有没有一种简单的方法可以在Java中复制对象?,java,inheritance,object,reference,copy,Java,Inheritance,Object,Reference,Copy,我的GUI中有一个类时间线。我有一个功能,我想复制这个时间线,并修改其中的数据,而我的GUI中的时间线不会受到影响 我搜索了一些论坛,还没有找到一个简单的方法,因为Java让引用保持不变。为什么没有一个简单的方法来创建一个新的对象(时间线),它没有对前一个对象的引用 请帮助我制作此时间线对象的副本 如果要复制对象,请使用 如果我误解了您的问题,请评论如果您想复制对象,请使用 如果我误解了你的问题,请评论你正在寻找的方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文

我的GUI中有一个类时间线。我有一个功能,我想复制这个时间线,并修改其中的数据,而我的GUI中的时间线不会受到影响

我搜索了一些论坛,还没有找到一个简单的方法,因为Java让引用保持不变。为什么没有一个简单的方法来创建一个新的对象(时间线),它没有对前一个对象的引用


请帮助我制作此时间线对象的副本

如果要复制对象,请使用


如果我误解了您的问题,请评论

如果您想复制对象,请使用

如果我误解了你的问题,请评论你正在寻找的方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文档更正式)

例如

你在寻找方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文档更正式)

例如


在Java中,使用运算符“=”只是将引用复制到对象。如果要实现按值复制,请使用克隆操作(类对象的clone()方法)或实现自己的克隆方法(覆盖已实现的方法)


请注意,如果您的类在其中存储了其他对象,那么这些对象最终也应该被克隆(深度复制)

在Java中,使用运算符“=”只是将引用复制到对象。如果要实现按值复制,请使用克隆操作(类对象的clone()方法)或实现自己的克隆方法(覆盖已实现的方法)

请注意,如果您的类在其中存储了其他对象,那么这些对象最终也应该被克隆(深度复制)

此处其他作者建议的方法和接口是在错误的假设下创建的,即使用通用复制方法是个好主意。默认实现对当前对象进行浅克隆,但您可以覆盖它以进行深克隆

没有正确、通用的方法来复制任意对象,您要复制的内容取决于所涉及的对象。例如,不可变对象永远不需要复制(那只是浪费空间),而某些类型的对象无法复制(例如,如何复制
FileOutputStream

我发现最优雅的方式是不可变对象,其方法返回的副本仅更改了一个字段:

class Pony {
    private final String name;
    private final Color color;
    private final int tailLength;

    // constructors and accessors omitted

    Pony withName(String newName) {
        return new Pony(newName, color, tailLength);
    }

    Pony withColor(Color newColor) {
        return new Pony(name, newColor, tailLength);
    }

    Pony withTailLength(String newTailLength) {
        return new Pony(name, color, newTailLength);
    }
}

// Usage:

Pony tony = new Pony("Tony", Color.DAPPLE, 32);
Pony maurice = tony.withName("Maurice") // Maurice is like Tony, but black.
                   .withColor(Color.BLACK);
不幸的是,通过这种方式得到了很多样板文件,而且也没有主流IDE支持(尽管可能有插件)。与此相关的是Josh Bloch在《有效Java》中推荐的方法。

其他作者建议的方法和接口是在错误的假设下创建的,即使用通用复制方法是一个好主意。默认实现对当前对象进行浅克隆,但您可以覆盖它以进行深克隆

没有正确、通用的方法来复制任意对象,您要复制的内容取决于所涉及的对象。例如,不可变对象永远不需要复制(那只是浪费空间),而某些类型的对象无法复制(例如,如何复制
FileOutputStream

我发现最优雅的方式是不可变对象,其方法返回的副本仅更改了一个字段:

class Pony {
    private final String name;
    private final Color color;
    private final int tailLength;

    // constructors and accessors omitted

    Pony withName(String newName) {
        return new Pony(newName, color, tailLength);
    }

    Pony withColor(Color newColor) {
        return new Pony(name, newColor, tailLength);
    }

    Pony withTailLength(String newTailLength) {
        return new Pony(name, color, newTailLength);
    }
}

// Usage:

Pony tony = new Pony("Tony", Color.DAPPLE, 32);
Pony maurice = tony.withName("Maurice") // Maurice is like Tony, but black.
                   .withColor(Color.BLACK);
不幸的是,通过这种方式得到了很多样板文件,而且也没有主流IDE支持(尽管可能有插件)。与此相关的是Josh Bloch在有效java中的推荐。

而不是<代码>克隆()/Cube >您可能想考虑为类编写一个复制构造函数:

public TimeLine(TimeLine original) {
    this.foo = original.foo;
    this.bar = original.bar;
}
复制类中任何引用字段的值时要小心。确定是否需要浅拷贝或深拷贝。

而不是<代码>克隆()/代码>,您可能需要考虑为类编写一个复制构造函数:

public TimeLine(TimeLine original) {
    this.foo = original.foo;
    this.bar = original.bar;
}

复制类中任何引用字段的值时要小心。确定您是想要浅拷贝还是深拷贝。

相关:这是一个简单的只拷贝要求,还是您在面临问题时有其他问题?相关:这是一个简单的只拷贝要求,还是您在面临问题时有其他问题?不,您是对的,虽然我尝试过让TimeLine实现可克隆并添加了方法:public Object clone()。。。。当我试图创建这个.timeline=(timeline)timeline.clone()时,我得到了nullpointerexception.public Object clone()抛出CloneNotSupportedException{return super.clone();}请不要,如果你想进行深度复制,你必须覆盖clone方法并自己实现它。如果我不实现该方法,那么我该怎么做。clone()?不,你是对的,尽管我已经尝试使TimeLine实现可克隆并添加了方法:public Object clone()。。。。当我试图创建这个.timeline=(timeline)timeline.clone()时,我得到了nullpointerexception.public Object clone()抛出CloneNotSupportedException{return super.clone();}请不要,如果你想进行深度复制,你必须覆盖clone方法并自己实现它。如果我不实现该方法,那么我该怎么做。clone()?谢谢,为什么我在使用它时会得到NullPointerException?@cwallenpoole:clone的实现像深度克隆操作一样吗?我的意思是,它会自动在MyObject中存储的所有对象上调用clone吗?@0verboze默认情况下它是浅层的,(我添加了到Wikipedia的链接,并提供了一些详细信息)谢谢,为什么我在使用它时会得到NullPointerException?@cWallenPole:克隆的实现是否像深度克隆操作一样?我的意思是,它会自动在MyObject中存储的所有对象上调用clone吗?@0verboze默认情况下它是浅层的(我添加了Wikipedia的链接,并提供了更多信息)T