java只有按值传递 没有引用传递
结论
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
为什么没有引用传递
那就要先弄清楚什么是引用传递?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java里传递的是引用的副本,虽然这个副本也是引用。但是在Java中只能说是传递对象的引用,而不能叫引用传递。
ava传递的是引用的副本。而不是引用本身,所以引用没有传递,所以这个不叫引用传递。
例子
c++
class User{
public TV getTV(&TV tv){//C++可以这样来传递引用 而不是对象引用的副本 &TV 代表传入一个引用
//这里传递一个TV 的引用 这个引用跟Java的引用是有区别的
tv = new TV("xiaomi");//我修改为了小米牌的
//如果在Java里 这句话不会影响传入的tv 但是 C++ 会影响
}
}
java
class User{
public TV getTV(TV tv){
tv = new TV("xiaomi");//我修改为了小米牌的
//如果在Java里 这句话不会影响传入的tv 但是 C++ 会影响
}
}
上面代码如果是在c++中,那么实参tv被修改成了指向xiaomi的地址
而在java中,实参tv不会被改变,因为形参里的tv只是副本,它本身地址的改变不会影响实参。
所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。
易错点
上面说形参tv本身地址的改变不会影响实参,其实tv可以改变实参tv的内容。
比如
class User{
public TV getTV(TV tv){
tv.setName("xiaomi");
}
}
这样就改变了实参tv引用的对象。
下面举一个实际的例子:
你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。
你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。
但是,不管上面哪种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在pass方法中,改变user对象的name属性的值的时候,不就是在“砸电视”么。你改变的不是那把钥匙,而是钥匙打开的房子。
所以说你改变的不是实参tv地址,而是改变的tv指向的对象。而在c++中是可以直接改变tv地址的。
所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。
转载:
Java中的参数传递_好久不见-CSDN博客_java传参
为什么说Java中只有值传递_程序员小灰的博客-CSDN博客_java值传递
Java只有值传递 - 简书