为了账号安全,请及时绑定邮箱和手机立即绑定

下面这道面试不太懂啊,高人看看

下面这道面试不太懂啊,高人看看

Sace 2016-03-15 00:07:21
19行有空指针异常,这是为什么?user不是已经指向新创建的User对象了吗?
查看完整描述

9 回答

已采纳
?
子木李

TA贡献46条经验 获得超27个赞

Java里只有按值传递,没有按引用传递,之所以传递对象后能可改变这个对象的属性,是因为在方法中,传递的是一个该对象的副本,然后这个副本指向的是该传递过来的对象所指向的堆内存中的对象,所以,修改了副本所指向的属性同样会修改原始对象的属性,但是,当使用new时,副本和对象不再指向同一个地址,副本指向了一个新的地址,传入的参数还是指向原来的地址,所以,楼主这题里虽然在initUser中初始化了User对象,但是只是在这个initUser中user不是空的,传递过来的user依然是空的,也就是并没有初始化外面addUser函数里的user对象,所以会空指针异常

查看完整回答
6 反对 回复 2016-03-15
  • Sace
    Sace
    可不可以这么理解:在成员函数中创建的对象的生命周期仅限于在成员函数内,如果不进行return则可能会被虚拟机释放掉?
  • Caballarii
    Caballarii
    不一定,如果函数的参数是对象数组或者list,你创建一个对象加入这个数组或者list,是可以改变数组或者list的。
  • 漆黑夜明
    漆黑夜明
    的确。
点击展开后面1
?
慕尼黑6921937

TA贡献1条经验 获得超3个赞

java中,方法的参数是值传递,在initUser方法中,将user对象的地址赋值给了initUser中参数user,现在他们指向同一片地址。然而,方法initUser的参数在方法中又指向了另一地址,实际的user对象的地址依旧没变,仍然为null。

查看完整回答
3 反对 回复 2016-03-15
?
4T

TA贡献1条经验 获得超0个赞

java传参传入的对象其实是一个副本,相当于你穿参开始,就有2个user了,你改变initUser中的副本user当然不会改变到本来的user

查看完整回答
反对 回复 2016-03-15
?
慕无忌9989543

TA贡献1条经验 获得超0个赞

java中的参数传递 其实相当于一种赋值,如果是基本类型就是直接赋值,如果是引用类型就是把引用赋给形参,如上题,在addUser方法中 user 虽然是null,但是传递给initUser方法的时候他是实参,相当于将这个实参的引用赋给了initUser方法的形参 user,说白了 就是initUser方法的形参user指向了addUser方法里面的user(也就是指向了null),然后呢,在initUser方法里面,把形参user又指向了新的引用 new User(),这里的指向  和addUser方法里面的user没有一点关系,那个user还是指向null

查看完整回答
反对 回复 2016-03-15
?
孤舟放逐

TA贡献1条经验 获得超0个赞

使用对象作为参数传递的是对象的引用!!只有String作为参数例外!!

initUser(User user){

user=new User();

}

这个参数传递的只是null对象的引用,而user=new User()这句话已经将user指向了一个新的对象;

且这里的user参数和外面的user是不一样的,inituser(User user)里的user作用域就只是这个函数,所以外面那个user依旧指向了一个空的实例;


查看完整回答
反对 回复 2016-03-15
  • wswzh0329
    wswzh0329
    http://www.imooc.com/wenda/detail/311760 帮我看看介个 关于匿名内部类的问题 谢谢!
?
20091807

TA贡献3条经验 获得超0个赞

User user = null;的user 跟 initUser(User user)方法的user参数不是同一个栈上面的局部变量。

也就是方法里面只是给参数user这个局部变量赋值而已,当initUser方法退出时,参数user局部变量也就没了。

查看完整回答
反对 回复 2016-03-15
  • Sace
    Sace
    我觉得是和new的过程有关吧,因为在同样的init方法中如果传入一个单例对象的话,是可以进行操作的(就是划掉26行)
  • kokoromi
    kokoromi
    就你说的是对的,Java中只有值传递,user传进来后会被复制一个副本,而这个副本和原来的user位于栈中的不同位置,方法中的副本user存储的是 new User()对象在堆中的地址,而原来的处于栈中的另一个位置的user存储的依然是原来的null。
?
风尘之魂

TA贡献5条经验 获得超1个赞

不是有个=null写的很清楚啊  自然就是空指针了。

查看完整回答
反对 回复 2016-03-15
?
Caballarii

TA贡献1123条经验 获得超629个赞

initUser的参数获得的是user对象的地址的复制,所以不会改变原来user对象的地址

查看完整回答
反对 回复 2016-03-15
?
badbomb

TA贡献16条经验 获得超10个赞

只是传值,没有传地址

查看完整回答
反对 回复 2016-03-15
  • 9 回答
  • 5 关注
  • 2454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信