好的,这就是事情。我有一个指向对象的多个指针,我想删除它们。我在下面简化了它,所以不要理会为什么我会尝试下面的事情:)
String first = "ASSIGNED";
String second = test;
second = null;
System.out.println(first);
在上面的示例中,输出仍然会导致“ASSIGNED”。但是,我想首先不再分配。在上面的示例中,通过将其设置为null很容易,但在我的实际示例中,这是不可能的(首先将其传递到方法中,我想要删除分配)。
修改
所以,我想问题是,如果可以删除指向对象的所有指针。
显然我的要求有点模糊,所以让我们试着给出一个更好的例子:
String first = "Assigned";
doSomethingAndRemove(first);
public void Remove(String string) {
//Do something
//...and remove
string = null;
}
事情是,第一个仍然是引用“已分配”...但是从我到目前为止在答案中读到的内容来看,没有办法解决这个问题?
答案 0 :(得分:1)
C#可以使用ref
来完成,但Java不能。如果你必须这样做,以下是Java的最后一招。
public class Nullify
{
public static void main(String[] args) {
String[] first = { "ASSIGNED" };
System.out.println("first[0] = " + first[0]);
nullify(first);
System.out.println("first[0] = " + first[0]);
}
private static void nullify(String[] array) {
array[0] = null;
}
}
答案 1 :(得分:1)
不,不可能删除给定对象的所有“指针”,因为Java没有指针,它们被称为引用。
Java和JVM都不知道对给定对象的所有引用。这就是为什么垃圾收集器必须扫描所有内容才能找到未使用的对象。
您必须清除引用,并且您无法清除用于从被调用方法中传递参数的引用变量,因为Java是按值传递,意味着引用(不是对象)被复制。
示例:
public static void main(String[] args) {
String var1 = "Hello";
doSomething(var1); // The value of var1 is copied to param1
}
private static void doSomething(String param1) {
param1 = null; // Only clears the param1 reference
var1 = null; // Cannot do this, because doSomething() does not have access to var1
}
只有方法main
中的代码才能更改var1
的参考值。
<强>更新强>
如果您希望方法doSomething
能够将var1
更新为其他值,请执行以下操作: null
,然后通常的做法是简单地返回更新后的值。
public static void main(String[] args) {
String var1 = "Hello";
var1 = doSomething(var1);
}
private static void doSomething(String param1) {
// do something with param1
return "Goodbye";
}
这当然只有在您没有不同类型的返回值时才有效,并且仅适用于单个值。
可以使用持有者模式在Java中模拟输出(和输入/输出)参数,例如,见Output Parameters in Java
答案 2 :(得分:0)