这是我的代码。我将null设置为此引用,然后为什么打印 not null set
Test.java
try
{
new Test().setNull();
System.out.println("not null set");
}
catch (Exception e)
{//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
public void setNull()
{
setNull(this);
}
public void setNull(Object thisRef)
{
thisRef = null;
}
输出: 非空集
答案 0 :(得分:11)
Java不是Call by Reference。 Java不是Call by Reference。 Java不是..
分配给本地变量 不更改调用者提供的任何参数。如初。
因此该函数"什么都不做":它将null
分配给局部变量(也是一个参数)并返回。
答案 1 :(得分:4)
设置对null
的引用不会抛出NPE
,否则请想一想如何使references
无效?
此外,当您为任何引用分配null
时,只有该引用与它指向的对象分离。但其余的参考文献仍然存在。
例如: -
MyClass obj1 = new MyClass();
MyClass obj2 = obj1;
obj1 = null; // only obj1 is detached from object
System.out.println(obj2); // obj2 still points to original object
因此,当您调用方法时: -
new Test().setNull();
参考的副本存储在this
中(Java 不通过引用传递,而按值传递引用)< / em>,然后再次传递给另一个方法,因此再创建一个副本,然后将其设置为null。但原始参考仍指向该对象。
当您尝试在null
引用上调用任何方法或访问任何对象属性时,只能抛出NPE。
答案 2 :(得分:1)
您的代码不完整。请在下次发布一个最小的工作示例。
您将this
作为参数传递给setNull()
。请记住,参数是通过Java中的值传递的。 thisRef
已初始化为指向与此相同的实例,但当您将null
重新分配给thisRef
时,this
的值仍保持不变。
答案 3 :(得分:1)
对你自己的例子另有解释:
package com.test;
public class Test {
public void setNull() {
System.out.println("Before setting null : "+ this);
System.out.println("Going to set null");
this.setNull(this);
System.out.println("'this' after setting null in caller method : "+this);
this.print();// make sure that 'this' is not null;
}
public void print()
{
System.out.println("Another method");
}
public void setNull(Object thisRef) {
// here you are referring the 'this' object via a variable 'thisRef'
System.out.println("Inside setNull");
System.out.println("thisRef value : " + thisRef); // same as 'this'
// nullifying the 'thisRef'
thisRef = null;
System.out.println("thisRef after nullifying : "+thisRef);// ofcourse 'thisRef' is null
System.out.println("'this' after setting null in method : "+this); // here the 'this' object will not be null
}
public static void main(String[] args) {
new Test().setNull();
}
}
和控制台输出:
Before setting null : com.test.Test@3e25a5
Going to set null
Inside setNull
thisRef value : com.test.Test@3e25a5
thisRef after nullifying : null
'this' after setting null in method : com.test.Test@3e25a5
'this' after setting null in caller method : com.test.Test@3e25a5
Another method