Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的引用对象_Java_Function_Reference - Fatal编程技术网

Java中的引用对象

Java中的引用对象,java,function,reference,Java,Function,Reference,我对Java中的对象引用有疑问。它总是通过引用函数来发送其对象,这意味着如果您在发送的函数中修改它们,它们将被修改回来 解决方法是在发送之前复制对象。但是,我必须在对象类中创建一个复制函数吗?或者还有其他选择吗?谢谢您应该自己为每个对象创建一个副本构造函数。原因很简单:如果A引用了B,并且您想要复制A,您会将引用复制到B还是复制整个被引用的B对象?必须针对每种情况单独回答此问题,因此没有通用的解决方案。您确实发送了对象,并且将对引用的对象进行更改。在Java中没有简单的“本机”复制对象的方法,但

我对Java中的对象引用有疑问。它总是通过引用函数来发送其对象,这意味着如果您在发送的函数中修改它们,它们将被修改回来


解决方法是在发送之前复制对象。但是,我必须在对象类中创建一个复制函数吗?或者还有其他选择吗?谢谢

您应该自己为每个对象创建一个副本构造函数。原因很简单:如果A引用了B,并且您想要复制A,您会将引用复制到B还是复制整个被引用的B对象?必须针对每种情况单独回答此问题,因此没有通用的解决方案。

您确实发送了对象,并且将对引用的对象进行更改。在Java中没有简单的“本机”复制对象的方法,但您可以使用框架(如Dozer:


我通常会为此类场景添加一个复制构造函数,如下所示:

public class MyObject {
    //members


    public MyObject(MyObject objectToCopy) {
       this.member = objectToCopy.member;
       //...
    }
}
然后你可以用一条简单的直线画一个新的物体

public void DoWork(MyObject object) {
    MyObject copy = new MyObject(object);
    //do stuff
}

Java总是按值传递。您所描述的是按值传递对象引用

这里有一个关键的区别。您没有将对象作为引用传递,因此引用链接已断开。只要引用值保持不变,当您返回调用方时,更改传入对象的内容就会持续。另一个关键区别是参考值可以是
null
。。。但是
null
不是一个对象-那么如何引用没有对象的情况呢

如果要创建新对象,则需要复制现有对象。复制应在方法内部执行,以确保操作一致

对于简单对象(具有浅类层次结构的对象,如以下示例),通常可以使用基本的复制构造函数:

class Album {
  private String title;
  private String artist;

  public Album(Album copy) {
    this.title = copy.title;
    this.artist = copy.artist;  
  }
}
这将允许您在方法中复制对象:

public void copyAlbum(Album album) {
    album = new Album(album); // Clone the album passed in
}

对于更复杂的对象图,您可能希望使用库(如或)来准确地创建对象的深度副本。有一些关于在Java中复制对象的有用建议。

它总是通过引用函数来发送其对象。不,它发送引用值的副本。没有简单的解决方案。看一看java中不可变对象的解释:如果你想让对象不可变,你必须自己编程。@BLuFeNiX你应该读:@BLuFeNiX不,它是不同的。通过引用传递意味着您可以在调用上下文中更改局部变量或字段的值,因为您将引用传递给这些内存位置。(而不是一个具有这些字段的对象,那就是“不计算”。)这是java中不能做的事情,而C++、C++和PHP中都是很容易做到的。通过引用传递意味着您必须能够将左值传递给被调用函数,如果这有助于澄清问题的话。在Java中,您只能传递(可能是可变的)右值。嗯,您每天都会学到一些新东西。实现克隆不是最佳做法吗?-1:很抱歉,这是复制/克隆对象的错误方式。更多信息:对于更复杂的对象,这会导致非常混乱的代码。我不建议像这样复制。@Vengard对于复杂的对象,我可能同意你的看法,但用大锤钉钉子是愚蠢的。简单对象可以使用比reflection@LuiggiMendoza我要对你说的和我对文加德做的一样。。。此外,任何使用反射的行为都会带来更大的性能损失,这一点在第一句话中不应被忽视+1。在你编写克隆对象的示例之前,你的答案是好的……请定义简单的类(而不是对象,因为对象是类的实例)。啊,这是一场针对复制构造函数危险的古老战争!我不同意,手工复制对象是迄今为止确保正确复制的最安全的方法。克隆工具在某些情况下很有用,但您必须为该作业使用正确的工具。我见过更多错误配置的推土机克隆对象的坏例子,比我用传统的复制构造函数方法克隆对象的例子多得多。