提问人:tycoon 提问时间:8/29/2021 最后编辑:Namantycoon 更新时间:8/29/2021 访问量:364
如何在 java 中删除/删除对象,以便在下次使用编译器时出现错误
How to delete/remove an object in java so that when using next time compilor throught an error
问:
我使用bar函数创建了一些对象,如下面的代码所示。F2 指向 F1,F3 指向 F2,类似于 LinkedList。现在我想删除 f2,所以我做了这个 f2 = null。但是当我调用函数 f3.reveal 时,它仍然可以看到 f2 的数据。
public class prog {
public static void main(String[] args) {
bar f1 = new bar(12, null);
bar f2 = new bar(23, f1);
bar f3 = new bar(42, f2);
f2 = null;
f3.reveal();
}
}
class bar {
final int data;
final bar prev;
bar(int data, bar prev) {
this.data = data;
this.prev = prev;
}
void reveal() {
System.out.println("Value of this object is " + this.data);
System.out.println("Value of Previous object is " + this.prev.data);
}
}
- 我想知道为什么即使在将 f2 设置为 null 之后,我如何访问 f2.data。
- 我怎样才能正确地做到这一点
答:
0赞
Parag Goel
8/29/2021
#1
如果您正在尝试创建一个链接列表,那么要完全删除它,您还必须从前节点和后节点中删除引用。 这意味着您必须在 f1 上一个地址中输入 f3。
评论
0赞
tycoon
8/29/2021
不,我不是要创建一个仅供参考的链表
0赞
Parag Goel
8/29/2021
即使您没有尝试创建链表。您的对象在被其他对象引用之前不会被垃圾回收。因此,您必须先删除该引用以使其被垃圾回收。
0赞
tycoon
8/29/2021
这是我唯一不能使用垃圾收集器的一点。因此,当我在 null 上调用方法时,我想要一个 NullPointer 异常
0赞
Parag Goel
8/29/2021
您是否尝试从 F2 中删除 F3 的 ref。
0赞
user16632363
8/29/2021
您不是在“在 null 上调用方法”——f3.prev 不是 null。您尚未编写任何代码来使 f3.prev 为 null。您只编写了将 f2 设置为 null 的代码。
1赞
user16632363
8/29/2021
#2
您似乎对变量、对象和对对象的引用感到困惑。
f2
只是一个引用对象的变量。清空 f2 不会对对象执行任何操作,也不会使对对象的任何其他引用(如 .f3.prev
f3.prev
仍然是对它以前引用的对象的有效引用。
如何正确地做到这一点?
这很难说,因为你的概念是歪曲的。你到底想达到什么目的?如果你的意图是将对某个对象的所有引用都清空,那么你必须对该对象的所有引用都清空(这意味着需要知道所有这些引用可能在哪里)。
这不是关于垃圾回收的问题,只是取消单个引用不会神奇地取消所有其他引用。
在链表的特定情况下,“正确”是从列表中删除对象(因此没有指向它的链接),然后清空 。prev
f2
评论
0赞
tycoon
8/29/2021
这是一个很好的解释。所以我得到了第一部分,但是有没有办法做到这一点,比如直接删除对象而不是它的引用。
0赞
tycoon
8/29/2021
所以this.prev也是一个引用,如果我将其设置为null,我只能通过创建一个将其设置为null的方法来实现。但是我必须在 F3 上调用该方法
0赞
user16632363
8/29/2021
你应该在更高的层次上看待它。不要从“取消引用”的角度来思考。您已将对象放入列表中。您将(非常明智地)能够在列表中找到您的对象,直到您实际将其从列表中删除。你的第一项工作是编写一个“删除”方法。
上一个:如何从资产中获取File对象?
下一个:C语言中的投射是如何工作的?
评论