将对象添加到数据结构时,始终会添加对象的引用,而不是对象本身。那么下面的代码片段基本上是一样的吗?
Snippet 1 -
Object objectRef = new Object();
Vector vector = new Vector();
vector.add(objectRef);
Object object = (Object)vector.get(0);
Snippet 2 -
Vector vector = new Vector();
vector.add(new Object());
Object object = (Object)vector.get(0);
答案 0 :(得分:3)
Java总是按值传递引用。因此,无论何时使用引用作为函数调用的参数,引用值都是复制。对象本身未传递,其引用的副本是。理解它是一个重要的区别。同样重要的是要理解,通过引用,您(或库)仍然可以对通过其引用传递的对象进行操作。
您的摘要并不完全相同。在(1)中,您最终会对同一个对象objectRef
和object
进行两次引用。在(2)中,您最终只得到object
。在这两种情况下,向量都有一个不同的对象的引用。
答案 1 :(得分:0)
两个片段是相同的,唯一的区别是你有一个名为objectRef的位置变量,它可以在添加到矢量后修改,如果它被修改,它将反映在从矢量返回的对象中因为它是同一个对象。虽然“Object”类并没有任何可以修改对象的方法。
答案 2 :(得分:0)
这是对的。在java编程语言中只有堆。每一个物体都存在于魔法堆地。每个非原始值只是一个指针,其唯一的操作是取消引用。可以将List视为字符串指针列表,字符串的实际数据内容在堆上,而不是在集合结构中。
(这当然是语言的语义。现代运行时没有义务以这种方式实际执行它,JIT使用方法堆栈,它只需要表现得就像它以这种方式工作一样。)< / p>
答案 3 :(得分:0)
它们导致相同的状态,除了在代码段2的末尾,您没有名为objectRef的符号。
答案 4 :(得分:0)
两个片段都给出了相同的结果。不同之处在于,在第一个代码段中,您有三个对同一对象的引用(objectRef
,object
和vector
中的引用),而在第二个代码段中,您只有两个引用相同的对象(object
和vector
中的引用)。