我需要一些java帮助。我只是java的初学者。但我相信我的基础非常扎实。
当我遇到2个我的ArrayList对象时,我正在创建一个简单的java应用程序。让我们称他们为list1
和list2
。如果我将list1等于list2 list1 = list2;
并将一个元素添加到list2 list2.add(obj)
,则该元素也会添加到list1中。
我做了我的研究,发现我应该这样做list1 = new ArrayList(list2);
我不知道java对象像指针一样工作。我认为当2个对象相等时,只传递值。我甚至创建了一个简单的测试应用程序,可以设置和获取一些对象。同样,我等同于两个对象。更改1个对象的元素似乎也会影响其他对象。我不知道应该如何在Google上搜索这个内容。这就是我为你提供整个故事的原因。我只获得与c编程相关的文档。我觉得我的基础刚刚破碎。我刚才知道=
现在如何运作。试过做
int num1 = 666;
int num2 = num1;
num1 = 42;
这不会影响num2。然而,
Object obj1 = new Object();
Object obj2 = obj1;
obj1.changeSomeElement();
这会影响obj2
现在,我对=
在java中的工作原理感到困惑。有人请分享一些有用的文档供我阅读。谢谢!
答案 0 :(得分:3)
int num1 = 666;
int num2 = num1;
num1 = 42;
这是有效的,因为int是原始数据类型
Object obj1 = new Object();
Object obj2 = obj1;
obj1.changeSomeElement();
这不起作用,因为Object是参考数据类型
obj1持有对创建的Object的引用,你只是将同一个引用从obj1传递给obj2
即obj1& obj2引用相同的对象
无论您使用obj1还是obj2,都会对同一个对象进行更改:)
Primtive vs Reference Data Types
关于原始与参考数据类型及其含义的非常好的解释
答案 1 :(得分:2)
在Java中,变量是对象的引用。所以当你说:
Object obj2 = obj1;
obj2存储与obj1相同的引用。这就是为什么如果你修改obj1引用的对象,你也在编辑obj2引用的对象(它是两个变量引用的同一个对象)。
答案 2 :(得分:0)
在第一种情况下,您通过再次分配更改了num1。在你的第二个中,你在对象上调用了一个方法。
现在有一个更精确的答案:当你分配一个对象(=你的赋值运算符)时,你所做的就是说'这指向内存中的这个对象'。
因此,当您执行obj1 = obj2
时,您使用指向同一对象的两个指针。当然,当你改变一个时,你改变另一个,因为它们实际上是相同的而且只是。
原始类型(boolean,int,long,double,float,char,byte)是不可变的:您无法更改它们,您必须重新分配它们。因此,您实际执行的操作是更改其中一个引用而不触及另一个引用。
答案 3 :(得分:0)
也许这本书可以帮到你: http://pkris001.freeshell.org/OCA.pdf 第83页(pdf-第116页)
描述了您的问题简而言之: Java在存储对象和原始数据类型值方面有所不同。
为正在运行的程序分配的内存分为两部分。 HEAP内存和STACK内存。
只有HEAP-memory存储具体对象,而不存储任何其他对象。
new MyClassX(); // this object exists in the HEAP
STACK-memory用于保存这些创建对象的引用。
MyClassX refVar = new MyClassX(); // refVar holds one reference to the memory-address of the new MyClassX object.
对于原始数据类型值,它有点不同。 原始数据类型(boolean,byte,short,int,long,char,float,double,...)直接存储在STACK-memory部分。
int primVal = 1; // primVal stores the concrete value not a reference of 1;
所以当你复制时会发生什么...
primitve数据类型:
int primValOne = 1; // primVal stores the concrete value 1;
int primValTwo = primValOne; // primValTwo is a primitive datatype so it stores the concrete value 1, NOT a reference of primValOne
对象:
MyClassX refValOne = new MyClassX(); // refValOne stores a reference to a HEAP-memory position
MYClassX refValTwo = refValOne; // refValTwo stores the same reference like refValOne now