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

http://img.mukewang.com/56e6e1750001b7b408610437.jpg

19行有空指针异常,这是为什么?user不是已经指向新创建的User对象了吗?

Sace
浏览 2442回答 9
9回答

子木李

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

慕尼黑6921937

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

4T

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

慕无忌9989543

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

孤舟放逐

使用对象作为参数传递的是对象的引用!!只有String作为参数例外!!initUser(User user){user=new User();}这个参数传递的只是null对象的引用,而user=new User()这句话已经将user指向了一个新的对象;且这里的user参数和外面的user是不一样的,inituser(User user)里的user作用域就只是这个函数,所以外面那个user依旧指向了一个空的实例;

20091807

User user = null;的user 跟 initUser(User user)方法的user参数不是同一个栈上面的局部变量。也就是方法里面只是给参数user这个局部变量赋值而已,当initUser方法退出时,参数user局部变量也就没了。

风尘之魂

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

Caballarii

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

badbomb

只是传值,没有传地址
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java