JAVA在方法的末尾将对象指向空,在调用方法完毕后,再输出对象的值,对象不是null

class DataWrap
{
int a;
int b;
}
public class ReferenceTransferTest
{
public static void swap(DataWrap dw)
{
int tmp = dw.a;

dw.a = dw.b;

dw.b = tmp;
System.out.println("swap方法里,a成员变量的值是"

  • dw.a + ";b成员变量的值是" + dw.b);

// 把dw直接赋为null,让它不再指向任何有效地址。
dw = null;
// System.out.println(dw.a+""+dw.b);
}

public static void main(String[] args)
{
DataWrap dw = new DataWrap();
dw.a = 6;
dw.b = 9;
swap(dw);
// dw=null;

System.out.println("交换结束后,a成员变量的值是"

  • dw.a + ";b成员变量的值是" + dw.b); } }

这里方法的最后释放了dw,指向空,但是调用方法之后,再次输出dw的a,b,可以得到输出值。

但是如果是使用注释的任意一句话,都会提示说该句有一个nullpoint异常。

但是方法最后不是dw指向null了吗?为什么执行了swap之后,print语句不报空指针异常呢?
而打开其他两句的注释 会报异常?

形参和实参的区别
方法中的形参和实参只是指向了同一个对象,但形参和实参的引用并不是同一个

这是参数有效范围的问题,你在swap中吧swap方法参数dw赋值了null,但是这个赋值的有效性仅限在swap方法里面,当swap方法执行完,这个赋值操作就无效了。这也是楼上说的形参与实参的区别。

如果swap之外要用这个赋值结果,可以吧这个赋值结果return返回,当然也有其他处理方式。

这一点不难解释:

首先,方法调用之前,你定义了一个对象,然后再把该对象的引用传递给某一个方法,这里是引用传递,是形式参数,你的方法知道了这个引用的地址,可以理解为跟值传递是一样的,传递了一份地址的复制。
但是调用者的指针仍然是指向原来的地址的,你在方法内部将该引用地址指向null,并没有把原来调用的地址指向null。
其次,我们常说的引用传递,改变该地址的内容的时候(如修改对象的某个属性值),原来引用的相同地址的地方再次访问时属性信息也会变。