这个==在java中为null,之后还执行为什么继续?

时间:2012-11-21 05:59:09

标签: java

这是我的代码。我将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;
  }

输出: 非空集

4 个答案:

答案 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)

  1. 您的代码不完整。请在下次发布一个最小的工作示例。

  2. 您将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