为什么相同的引用变量指向存储在数组中的不同地址

时间:2014-05-26 23:15:47

标签: java arrays garbage-collection

我用相同的引用变量创建了3个对象,并将它们全部存储在数组中。当我打印这些引用变量时,它们都显示不同的地址。我被告知是否某个对象松散了它的引用变量GC将它从堆中删除,所以如何来同样的参考变量显示3个不同的位置,GC不起作用?实际上堆中有3个对象或同一个引用变量有3个内存地址

class MyClass {

    public static void main(String[] args) {
        MyClass[] i = new MyClass[3];

        for (int j = 0; j <= 2; j++) {
            MyClass p = new MyClass();
            i[j] = p;
        }

        for (int k = 0; k <= 2; k++) {
            System.out.println(i[k]);
        }
    }
}

输出:

[shadow@localhost String]$ javac MyClass.java 
[shadow@localhost String]$ java MyClass 
MyClass@138532dc
MyClass@dce1387
MyClass@54640b25
[shadow@localhost String]$

3 个答案:

答案 0 :(得分:1)

您仍然可以引用数组中的对象,并且您可以在程序中引用该数组。 GC无法对这些对象采取行动。

  

有人告诉我,如果某个对象松动,它的引用变量GC会将其从堆中删除

如果没有对该对象的可访问引用,则会发生垃圾收集。

答案 1 :(得分:0)

你写了

  

有人告诉我,如果某个对象松动,它的引用变量GC会将其从堆中删除

如果某个对象丢失了所有其可从堆栈中获取的引用,而不仅仅是其中一个,则它只能从堆中删除它。通过保持对名为i的数组中所有三个对象的引用,可以防止它们被垃圾回收。

答案 2 :(得分:0)

回答标题中的问题,因为你在循环中为它分配了三个连续的不同值。