Java值传递
定义参数:实参和形参
定义参数分为实参和形参。
形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。
参数传递方式:值传递和引用传递
调用有参方法的时候,会将实际参数传递给形式参数。
在程序执行过程中,传递过程可以分为值传递和引用传递两种形式
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java是值传递?
代码测试1:
//值传递
public class Demo03 {
public static void main(String[] args) {
int a =1;
System.out.println(a);//1
// Demo03.change(a);
change(a);
System.out.println(a);//1
}
//返回值为空
public static void change(int a){
a = 10;
}
}
传递的是int类的值。
代码测试2:
public class passTest02 {
public static void main(String[] args) {
passTest02 passTest02 = new passTest02();
User wenyao = new User();
wenyao.setName("wenyao");
wenyao.setGender("Male");
passTest02.pass(wenyao);
System.out.println("print in main, user is "+wenyao.toString());
}
public void pass(User user){
//user = new User();//在堆中new了一个User对象,新开辟了一片内存。删掉这行会使得形参User user和实参wenyao指向同一个地址
//删除前
//print in pass, user is com.oop.demo01.User@1b6d3586
//print in main, user is com.oop.demo01.User@4554617c
//删除后
//print in pass, user is com.oop.demo01.User@1b6d3586
//print in main, user is com.oop.demo01.User@1b6d3586
user.setName("Jeremy");
System.out.println("print in pass, user is "+ user.toString());
}
}
class User{
String name;
String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
代码测试3:
public class passTest01 {
public static void main(String[] args) {
passTest01 passTest01 = new passTest01();
String name = "wenyao";//等价 String name = new String ();
passTest01.pass(name);
System.out.println("print in main, name is "+name);
}
public void pass(String name){等价 String name = new String ();
name = "Jeremy";//等价于 String name = new String ("Jeremy"),
// 即给形参在堆中new了一个对象,开辟了一片内存。于是形参实参指向不同地址
//如果不改变name的值,name的值是原来(实参)的引用
System.out.println("print in pass, name is "+ name);
}
}
String类是一个特殊的类。传递的String类的对象name,在给name赋值时候实际新开辟了内存空间。
值传递的解释
下面是网友关于java值传递的解释:
传递对象类型的时候是传递引用的拷贝,在swap(Class A,Class B)这个交换方法中,引用的拷贝被交换,但是实际的引用没有被交换,所以得出结论java只有值传递,因为传递的实际该对象的引用即不是该对象的内存地址,而是该引用的拷贝而已。
首先明确两点 ·java中不管是值对象还是引用对象都是值传递·,·在其他方法里面改变引用类型的值肯定是通过引用改变的·,当传递引用对象的时候传递的是复制过的对象句柄(引用),注意这个引用是复制过的,也就是说又在内存中复制了一份句柄,这时候有两个句柄是指向同一个对象的,所以你改变这个句柄对应空间的数据会影响外部的变量的,虽然是复制的但是引用指向的是同一个地址,当你把这个句柄指向其他对象的引用时并不会改变原对象,因为你拿到的句柄是复制过的引用。总结java中的句柄(引用)是复制过的,所以说java只有值传递
参考文章:https://blog.csdn.net/bjweimengshu/article/details/79799485