对象参考

时间:2011-04-07 15:26:16

标签: java core

class Forest {    

    void lion(){  
        System.out.println("king of the jungle");
    }

    public static void main (String a[]){
        Forest f = new Forest();
        f.lion(); //call 1
        Forest j = f;
        j.lion(); // call 2
    }
}

呼叫1&的区别是什么?拨打2?
如果删除了对象f,那么在调用2中会发生什么?

6 个答案:

答案 0 :(得分:3)

  1. 对象不会被删除(因为引用仍处于活动状态,GarbageCollector不会销毁它)
  2. 调用是相同的(它们在同一个林实例上调用相同的方法
  3. 确实,做f = null;在j.lion()之前;没有任何明显的后果
  4. 此外,获取Eclipse之类的工具,当您不遵循Java的命名约定时,它会发出警告。最好在开始时习惯它。

答案 1 :(得分:1)

调用1和调用2之间没有区别。调用new forest()时,会在堆上分配新的forest对象并进行初始化。对该对象的引用存储在您声明为f的变量中。当您将变量j初始化为f的值时,它只是存储对forest中相同j对象的引用。将f设置为null不会导致forest对象被垃圾回收(删除)。 forest对象不会被垃圾收集,直到对它的所有引用都被清空或超出此处不会发生的范围。

答案 2 :(得分:0)

  1. 没有
  2. 没有
  3. 想想电话号码等参考文献。您可以为手机分配多个号码,但如果您将其删除,则手机仍然存在,并且他们可以通过其他所有号码给您打电话。如果您删除所有号码,则没有人能够给您打电话。

    (但是没有魁梧的垃圾收集者第二天早上出现摧毁你的手机,这就是类比分解的地方。)

答案 3 :(得分:0)

两个调用都会在lion()f引用的基础林上调用j。如果f不再引用基础林但j仍然引用,那么j.lion()仍将按预期工作。

这里要记住的是fj是对森林的引用 - 它们所指的实际森林存在于记忆的某个地方。在不再引用实际底层林的时刻,该林成为垃圾收集的候选者(注意:它可能不会立即被垃圾收集)。但只要至少有一个对基础森林的引用仍然存在,该森林仍然存在。在此处,使f不再引用基础林仍然引用j引用它,因此基础林仍然存在,并且调用j.lion()将成功。

答案 4 :(得分:0)

方法lion()在底层对象实例上调用相同。您可以设置f = null,但j引用仍将保留在实例上。

干杯,

答案 5 :(得分:0)

f称它为自己的狮子方法,其中j调用f的狮子方法。

如果f设置为null,则调用2将引发异常。