qq_33091747
qq_33091747
采纳率100%
2017-08-21 03:20 阅读 1.6k
已采纳

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语句不报空指针异常呢?
而打开其他两句的注释 会报异常?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    vane11 Vane11 2017-08-21 03:33

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

    点赞 1 评论 复制链接分享
  • wojiushiwo945you 毕小宝 2017-08-21 05:49

    这一点不难解释:

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

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

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

    点赞 评论 复制链接分享

相关推荐