Java面试题:值传递和引用传递(清晰易懂)


前言

首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中。
更何况,要想知道Java到底是传值还是传引用,起码你要先知道传值和传引用的准确含义吧?可是如果你已经知道了这两个名字的准确含义,那么你自己就能判断Java到底是传值还是传引用。
这就好像用大学的名词来解释高中的题目,对于初学者根本没有任何意义。


一、值传递和引用传递是什么?

值传递:在调用方法时将实际参数复制一份到方法中,在方法中对参数进行修改并不会影响到实际参数。
引用传递:在调用方法时将实际参数的地址直接传递到方法中,在方法中对参数进行修改会影响到实际参数。

二、如何理解Java中只有值传递没有引用传递

public static void main(String[] args) {
   ParamTest pt = new ParamTest();

   User hollis = new User();
   hollis.setName("Hollis");
   hollis.setGender("Male");
   pt.pass(hollis);
   System.out.println("print in main , user is " + hollis);
} public void pass(User user) {
   user = new User();
   user.setName("hollischuang");
   user.setGender("Male");
   System.out.println("print in pass , user is " + user);
}

输出结果:
print in pass , user is User{name=‘hollischuang’, gender=‘Male’} print in main , user is User{name=‘Hollis’, gender=‘Male’}
解析:
如果是引用传递,在pass()函数中的 user = new User()这段代码中,user的地址改变了,那么应该main函数中holis对象的地址也会变,在pass中改变了user对象中name成员的值,holis对象的应该也改变了,但是并没有。
这里就证明了pt.pass(holis)调用pass()函数是把holis的地址复制了一份,在传给形参的。


总结

地址值也是值,传递地址值不一定就是引用传递。
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值