为何修改PVector对象b后,对象a的值变为(7,8)?
为什么修改PVector b会影响到PVector a?
这是个非常典型的对象引用问题,在Java(Processing基于Java)环境里,像PVector这类对象类型的变量,存储的并不是对象本身的数据,而是指向内存中该对象的"引用地址"。
当你执行PVector b = a;这行代码时,你并没有复制出一个全新的PVector对象,只是让变量b和a共享了同一个对象的引用——简单说就是,a和b现在都指着内存里同一个(5,6)的向量对象。
所以后面你调用b.add(new PVector(2,2))的时候,本质上是通过b这个引用,去修改了它指向的那个唯一的向量对象。这时候用a去打印,当然会看到修改后的结果,因为a指向的也是同一个对象呀!
举个直观的例子:假设a是一把钥匙,开着一个装着(5,6)的箱子。你执行b = a,其实是复制了一把钥匙给b,两把钥匙开的是同一个箱子。你用b钥匙打开箱子把里面的数改成了(7,8),再用a钥匙打开,看到的当然也是修改后的内容。
如果想要让b成为独立的向量,修改它不影响a,你需要创建一个新的PVector对象,比如用copy()方法:
PVector a = new PVector(5,6); PVector b = a.copy(); // 复制a的内容到新的PVector对象里 b.add(new PVector(2,2)); print(a); // 现在会输出(5,6),因为b修改的是自己的独立对象
或者也可以直接通过构造函数新建:
PVector b = new PVector(a.x, a.y);
补充一句:Java里的基本数据类型(比如int、float)是值传递,赋值时会直接复制数值,所以不会出现这种问题,但所有对象类型(包括自定义类、PVector、ArrayList这些)都是引用传递,赋值时传递的是对象的引用地址,这点一定要注意哦!
内容的提问来源于stack exchange,提问作者martinstacey
相关产品推荐
相关产品推荐

