如何理解Java中的值传递?
我们都知道,在Java语言中没有指针这一说法,所以Java中是不存在引用传递的, Java中的方法调用都是按值传递,那我们应该如何理解Java的按值传参呢?
Ⅰ 引用类型(注意:Java中数组也是引用类型)的 “值传递"
首先,我们需要明确一点 Object object=new Object() 对于jvm来说它一共创建了两个对象 一个是在Java虚拟机栈里面的对象引用(即上述的object) 一个是在堆中创建的对象实例(即上述的Object) jvm创建完对象之后 将堆中对象的地址交付给object 引用对象 这样一来我们就可以使用对象引用来对对象进行一些操作了
我们首先看一个例子 :
@Data
public class Person {
private Integer age;
private String name;
public String getPersonInfo(Person person){ return String.format("age:%s\tname:%s",person.age,person.name); }
public Person(Integer age, String name) { this.age = age; this.name = name;}
}
public class Test {
public static void main(String[] args) {
Person person=new Person(8,"小孩子");
System.out.println(person.getPersonInfo(person));
//如果是引用传递的话 调用完wantChangePerson之后 person对象这个时候应该 age=18,name="大孩子" 事实是什么呢?
wantChangePerson(person);
System.out.println(person.getPersonInfo(person));
}
public static void wantChangePerson( Person newPerson ){
//在堆中创建一个新的Person对象并将该新创建的对象的地址赋值给newPerson 引用对象
newPerson = new Person( 18, "大孩子" );
}
}
输出:
这就说明了我们传递过去的newPerson 其实只是person的一个副本而已 只是刚好我们的副本也同样指向当前的Person对象 但是他们是不同的栈指针对象(但是都指向同一个对象)
person->Original Object newPerson->Cloned Object
结论:Java中引用类型的值传递 其实传递的是对象引用的拷贝 也是值传递的一直种 只是这里的值是 对象地址值 数组也是引用类型 这里不在赘述
Ⅱ.基本数据类型
基本数据类型的值传递非常好理解 因为基本数据类型本身就是在栈上进行分配的
比如有一个方法签名为 public swapValue(int a,int b); 我们在调用方法时只需将对象的变量传入即可 我们再来看一个例子 为什么说我们调用方法时传递的不是变量本身 而是它的副本
public class Test {
public static void main(String[] args) {
int a=10,b=5;
System.out.println(String.format("交换之前:\na=%d\tb=%d",a,b));
swapValue(a,b);
System.out.println(String.format("交换之后:\na=%d\tb=%d",a,b));
}
public static void swapValue(int a,int b ){
int temp=b;
b=a;
a=temp;
System.out.println(String.format("我完成了交换:\na=%d\tb=%d",a,b));
}
}
输出:
从输出结果来看 我们就可以得知 我们交换的只是两个形参本身的值 对我们定义的 a,b两个变量本身没有进行任何改变 所以对于基本数据类型的参数我们也只是传递了一个”值“拷贝而已
结论:不管是引用类型还是基本数据类型 我们Java在进行参数传递时都是进行值传递的 需要注意的是 Java引用类型传递的是"对象地址的值" 基本数据类型传递的是 基本数据类型的值 但都是值的拷贝传递