转自公众号:程序控
面试官爱问的一个基础问题:Java是值传递还是引用传递?
想必大家都对这个问题都有自己的看法,那到底事实是怎样的,我们又该如何回答面试官这个问题呢?今天咱们就来好好分析一波
值传递?引用传递?
首先,我们得先知道什么叫值传递,什么叫引用传递,知道这个才能理解Java到底如何做的。若想理解这两种传递需要先理解形式参数和实际参数两个概念
形式参数: 定义函数时使用的参数,用来接收函数传入参数,比如我们写个函数,函数中的参数为形式参数
(String str) { System..println(str)}
实际参数: 我们调用函数时,函数名后面括号中的参数称为实际参数,如下面例子所示
(String[] args) { A a = A()a.test()}
可以发现,当调用一个有参函数的时候,会把实际参数传递给形式参数;于是这个传递的过程便有两种情况,即值传递和引用传递
值传递就是把参数的值给你,调用函数时将实际参数复制一份传递到函数中,这样函数内部对参数内部进行修改不会影响到实际参数;而引用传递就不一样了,它直接把参数的实际地址给调用函数了,函数内部可直接修改该地址内容,会影响到实际参数
我来举个例子,我司有一个数据库A,仅允许内部人员操作,现在有个项目需要和别的公司合作,该数据库的数据需要交给合作公司一份,我总不能直接把我司数据库A地址给他们,让他们直接连我们数据库A吧,他们要是删库跑路了,那我boss岂不要杀我祭天了
所以这个时候,把我司数据库表数据拷贝一份到一个新的数据库B,合作公司可以看这个数据库B数据,他们也可以随意操作,不会影响我司数据库
这个操作就类似于值传递,如果合作公司直接操作我司数据库,就类似于引用传递了,这下大家应该晓得两者之别了
Java值传递还是引用传递?
我们了解了值传递和引用传递的概念,那Java中到底是哪种传递方式呢?我们来看代码分析
(String[] args) { Fans fans = Fans()t = fans.test(t)System..println(+ t) }
(t) { t = System..println(+ t) }
//输出In testIn main
上述代码,在main中定义t的值是1,在函数test中修改了参数t的值为2,这个结果是不是很容易分析出来了呢?test函数并未改变传入的t的值,那按照上面我们的介绍是不是可以得出结论:Java中是值传递
有的人可能会质疑,你传入的参数t是基本类型,你若传入引用对象类型,那肯定就会改变对象内容了,OK,再来看一段引用类型代码
= String = (Fans fans) { fans.= fans.= System..println(+ fans.++fans.)}
(String[] args) { Fans fa = Fans()fa.test(fa)System..println(+ fans.getA()++fans.getB())}
//输出
In testABnewFansIn mainABnewFans
哎啊,输出结果竟然一样了,也就是传入的fans对象被函数test修改了,那这样是不是又变成了引用传递了?
于是得出结论,基本类型是值传.........