2013-11-27 75 views
0

我在Java中出现了一些奇怪的问题。我在调试时已经确定了整个问题。它发生在这2条线上:了解对象变量赋值行为

q=p; 
q.addPair(2,3); 

笔记:p,q是我定义的新类。在这门课上,它有一个public function addPari(int, int)

这是我所期待的:复制pq,然后更改q使用q.addPair(),但留下p和以前一样。

我认为这可以工作,但不知何故,结果发现q.addPair(2,3)将改变pq。任何人都可以帮助我呢?

+0

Java从不复制任何东西。 – SLaks

回答

5
q=p; 

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

如果你想q是一个新的对象,你需要使用new

q = new MyObject(p); 

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

+2

请注意这一点; Java默认不提供拷贝构造函数,所以你必须自己在'P'和'Q'是实例的类中实现它。 – Tenner

0

随着q=p;你不“复制” P到Q,但你而是创建当q指向p的实例的引用。现在2个变量指向同一个对象。