Java中的参数传递都是值传递
首先java中是没有引用传递的。
- 形参与实参的概念
- 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来
接收调用该函数时传入的参数。 - 实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递
关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为
“实际参数”。
- 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来
- 值传递与引用传递
-
值传递(passby value)是指在调用函数时将实际参数复制一份传递
到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参
数。 -
引用传递(passby reference)是指在调用函数时将实际参数的地址
直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实
际参数,学过C或者C++的应该更加了解引用传递。 -
错误理解:
- 1、值传递和引用传递,区分的条件是传递的内容,如果是
个值,就是值传递。如果是个引用,就是引用传递。 - 2、Java中you引用传递。
- 3、传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。
- 1、值传递和引用传递,区分的条件是传递的内容,如果是
-
1、对基本数据类型:
public class Demo1 {
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
int i = 3;
demo1.change(i);
System.out.println("i在main函数中" + i);
}
public void change(int i){
i = 4;
System.out.println("i在change函数中" + i);
}
}
结果为:
i在change函数中4
i在main函数中3
change:方法内部对name的值的修改并没有改变实际参数i的值。那么,按照上面的定义,可得到结论:Java的基本数据类型传递是值传递。
2、对引用数据类型:
public class Demo2 {
public static void main(String[] args) {
Demo2 demo = new Demo2();
User guYue = new User();
guYue.setAge(18);
guYue.setName("古月");
demo.change(guYue);
System.out.println("guYue在main函数中" + guYue);
}
public void change(User guYue){
guYue.setAge(20);
guYue.setName("古月哥欠");
System.out.println("guYue在change函数中 " + guYue);
}
}
结果为:
guYue在change函数中User [name=古月哥欠,age=20]
guYue在main函数中User [name=古月哥欠, age=20]
经过change方法执行后,实参的值被改变了,那按照上面的引用传递的定义,实际参数的值被改变了,这就是引用传递了。有人便得出一个新的结论:Java的方法中,在传递基本数据类型的时候是值传递,在传递对象类型的时候是引用传递。但是,这种表述仍然是错误的。可以再看以下代码
public class Demo2 {
public static void main(String[] args) {
Demo2 demo = new Demo2();
User guYue = new User();
guYue.setAge(18);
guYue.setName("古月");
demo.change(guYue);
System.out.println("guYue在main函数中" + guYue);
}
public void change(User guYue){
guYue = new User();
guYue.setAge(20);
guYue.setName("古月哥欠");
System.out.println("guYue在change函数中" + guYue);
}
}
结果为:
guYue在change函数中User [name=古月哥欠, age=20]
guYue在main函数中User [name=古月, age=18]
change方法执行过后main函数里的值却没发生改变,如果是引用
传递的话通过:user = new Uer();引用会指向新的地址,
那么原对象肯定会发生改变,但却没发生改变,这说明传递对象
类型时并不是引用传递。可是上个会发生了改变,是因为这里是
把实际参数的引用的地址复制了一份,传递给了形式参数。所以
上面的参数其实是值传递,把实参对象引用的地址当做值传递给
了形式参数。