Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—为什么分配;空";to变量不可用于GC?(在此代码段中)_Java_Variables_Null_Garbage Collection - Fatal编程技术网

Java—为什么分配;空";to变量不可用于GC?(在此代码段中)

Java—为什么分配;空";to变量不可用于GC?(在此代码段中),java,variables,null,garbage-collection,Java,Variables,Null,Garbage Collection,我正在浏览oracle提供的在线教程。其中一个练习的问题如下: 下面的代码创建一个数组和一个字符串对象。代码执行后,存在多少对这些对象的引用?这两个对象都有资格进行垃圾收集吗 ... String[] students = new String[10]; String studentName = "Peter Smith"; students[0] = studentName; studentName = null; ... 答:有一个对students数组的引用,该数组有一个对字符串Pet

我正在浏览oracle提供的在线教程。其中一个练习的问题如下:


下面的代码创建一个数组和一个字符串对象。代码执行后,存在多少对这些对象的引用?这两个对象都有资格进行垃圾收集吗

...
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
...
答:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用。两个对象都不符合垃圾收集的条件

()



最后一行肯定表示studentName有资格申请GC?我真的很困惑,我想这意味着我没有理解“null”的本质,也没有正确地引用对象,这就是我为什么要问的原因。

在将
null
分配给
studentName
之前,有两个引用“Peter Smith”(
studentName
students[0]
)。将
null
分配给studentName后,
学生[0]

仍然引用“Peter Smith”

实际上,哪些对象不能被垃圾收集?“Peter Smith”和字符串[10]数组。请注意,这些是对象本身,而不是对对象的引用!只要存在一个引用就足以避免垃圾收集

我使用了一种心理技巧,即在阅读代码时要冗长。当您的意思是“字符串对象”(字符串中的单词)或“字符串引用”(指向单词的变量)时,很容易说“字符串”(模糊),因此此技巧避免了这种混淆

用我的思维技巧重写伪代码,将所有东西标记为对象或引用,就像我在脑海中所做的那样:

1 String[] OBJECT student REFERENCE = new String[10] OBJECT;
2 String OBJECT studentName REFERENCE = "Peter Smith" OBJECT;
3 students[0] REFERENCE = studentName REFERENCE;
4 studentName REFERENCE = null;

在第3行中,字符串[0]\u引用指向“Peter Smith”对象。现在很清楚,只有studentName引用被设置为null,但是“Peter Smith”对象仍然存在,数组仍然指向它。因此,对象永远不会为空,只有一个引用为空。

本页很好地解释了java引用的基本概念(以及它们本质上只是指针)


虽然不是关于这个问题,但它是直接相关的。在java中,对象由指针(引用)引用。理解这一点会有很大帮助。

您可能会被两个对象,但每个对象都有多个引用的事实所迷惑
studentName
不是一个对象,它是一个变量,一个引用。同样适用于
学生
。类似地,
students[0]
,数组
students
所指的第一个元素,不是字符串对象,而是字符串的引用。啊-我想我现在明白了……谢谢你的及时回答。那么studentName不是问题所指的“字符串对象”,而是“Peter Smith”本身?也就是说,studentName不是一个对象?我只是误解了这个问题吗?Thank.studentName是一个对象变量,因此可以保存对对象的引用。这些变量在不同的上下文中通常被称为“对象”,它只会在有限的情况下(如本例)引起混淆。问题说明代码创建了一个数组和一个字符串对象。对象本身就是“彼得·史密斯”;studentName是(暂时)引用它的一个地方。该对象仍然从这四行末尾的数组的第0个元素引用。我明白了。我想我的误解比我想象的要深。因此,代码
=“Peter Smith”
有效地初始化了一个值为“Peter Smith”的新字符串对象,并且由于字符串数组从其第0个元素引用了该对象,因此该对象保持不变。反过来,“Peter Smith”字符串对象保持不变,因为它被该数组引用?我知道很详细,但我只是想确保我能正确理解。谢谢你的及时回复,真的很有帮助。