Java 理解对象变量赋值行为

Java 理解对象变量赋值行为,java,Java,我在Java中遇到了某种奇怪的问题。我在调试时把整个问题都解决了。它发生在以下两行: q=p; q.addPair(2,3); 注:p,q是我定义的一个新类。在这个类中,它有一个公共函数addPari(int,int) 以下是我所期望的:将p复制到q,然后更改q使用q.addPair(),但保持p与以前一样 我原以为这是可行的,但不知怎么的,结果是q.addPair(2,3)会同时改变p和q。有人能帮我吗 q=p; 实际上没有复制。这意味着修改q也将修改p,因为它们是相同的实例 如果希望q成

我在Java中遇到了某种奇怪的问题。我在调试时把整个问题都解决了。它发生在以下两行:

q=p;
q.addPair(2,3);
注:p,q是我定义的一个新类。在这个类中,它有一个
公共函数addPari(int,int)

以下是我所期望的:将
p
复制到
q
,然后更改
q
使用
q.addPair()
,但保持
p
与以前一样

我原以为这是可行的,但不知怎么的,结果是
q.addPair(2,3)
会同时改变
p
q
。有人能帮我吗

q=p;
实际上没有复制。这意味着修改
q
也将修改
p
,因为它们是相同的实例

如果希望
q
成为新对象,则需要使用
new

q = new MyObject(p);
换句话说,您正在使用创建
p
的新副本。如果您的类没有复制构造函数,则需要创建一个:它需要能够从现有对象创建新对象。它可以通过从给定实例
p
复制适当的值来实现这一点

实际上没有复制。这意味着修改
q
也将修改
p
,因为它们是相同的实例

如果希望
q
成为新对象,则需要使用
new

q = new MyObject(p);

换句话说,您正在使用创建
p
的新副本。如果您的类没有复制构造函数,则需要创建一个:它需要能够从现有对象创建新对象。它可以通过复制给定实例中的适当值来实现这一点
p

Java通过引用赋值,因此您需要执行深度复制,以便将一个对象复制到相同类型的变量中,但随后有两个独立的对象


看看这个:

Java通过引用赋值,因此您需要进行深度复制,以便将一个对象复制到相同类型的变量中,但随后有两个独立的对象


看看这个:

With
q=p您不会将p“复制”到q,而是为q创建一个指向p实例的引用。现在这两个变量指向同一个对象。

With
q=p您不会将p“复制”到q,而是为q创建一个指向p实例的引用。现在这两个变量指向同一个对象。

Java从不复制任何东西。Java从不复制任何东西。请注意这一点;Java默认情况下不提供复制构造函数,因此您必须自己在类中实现它,
P
Q
都是实例;默认情况下,Java不提供复制构造函数,因此您必须自己在类中实现它,
P
Q
是实例。