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中会发生什么?
答案 0 :(得分:3)
此外,获取Eclipse之类的工具,当您不遵循Java的命名约定时,它会发出警告。最好在开始时习惯它。
答案 1 :(得分:1)
调用1和调用2之间没有区别。调用new forest()
时,会在堆上分配新的forest
对象并进行初始化。对该对象的引用存储在您声明为f
的变量中。当您将变量j
初始化为f
的值时,它只是存储对forest
中相同j
对象的引用。将f
设置为null不会导致forest
对象被垃圾回收(删除)。 forest
对象不会被垃圾收集,直到对它的所有引用都被清空或超出此处不会发生的范围。
答案 2 :(得分:0)
想想电话号码等参考文献。您可以为手机分配多个号码,但如果您将其删除,则手机仍然存在,并且他们可以通过其他所有号码给您打电话。如果您删除所有号码,则没有人能够给您打电话。
(但是没有魁梧的垃圾收集者第二天早上出现摧毁你的手机,这就是类比分解的地方。)
答案 3 :(得分:0)
两个调用都会在lion()
和f
引用的基础林上调用j
。如果f
不再引用基础林但j
仍然引用,那么j.lion()
仍将按预期工作。
这里要记住的是f
和j
是对森林的引用 - 它们所指的实际森林存在于记忆的某个地方。在不再引用实际底层林的时刻,该林成为垃圾收集的候选者(注意:它可能不会立即被垃圾收集)。但只要至少有一个对基础森林的引用仍然存在,该森林仍然存在。在此处,使f
不再引用基础林仍然引用j
引用它,因此基础林仍然存在,并且调用j.lion()
将成功。
答案 4 :(得分:0)
方法lion()在底层对象实例上调用相同。您可以设置f = null,但j引用仍将保留在实例上。
干杯,
答案 5 :(得分:0)
f称它为自己的狮子方法,其中j调用f的狮子方法。
如果f设置为null,则调用2将引发异常。