如何理解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, "大孩子" );

} 
}

 

输出: 

java 传对象应用 java传递对象是传值_Java

这就说明了我们传递过去的newPerson 其实只是person的一个副本而已 只是刚好我们的副本也同样指向当前的Person对象 但是他们是不同的栈指针对象(但是都指向同一个对象)

person->Original Object newPerson->Cloned Object

java 传对象应用 java传递对象是传值_java 传对象应用_02

 

结论: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));
} 
}

输出: 

java 传对象应用 java传递对象是传值_java 传对象应用_03

从输出结果来看 我们就可以得知 我们交换的只是两个形参本身的值 对我们定义的 a,b两个变量本身没有进行任何改变 所以对于基本数据类型的参数我们也只是传递了一个”值“拷贝而已

结论:不管是引用类型还是基本数据类型 我们Java在进行参数传递时都是进行值传递的 需要注意的是 Java引用类型传递的是"对象地址的值" 基本数据类型传递的是 基本数据类型的值 但都是值的拷贝传递