在说这个问题之前,我们先来看以下几段代码
基本数据类型
public class Test3 {
public void aa(int num){
num=20;
}
public static void main(String[] args) {
int num=10;
Test3 t3=new Test3();
t3.aa(num);
System.out.println(num);
}
}
输出结果:10
结果分析
当我们将num传递进去之后,实际上aa对num做了一个拷贝,copy后的值与原来的值没有关系了,故输出10。
数组类型
public class Test3 {
public void bb(int[] arr){
arr[0]=1;
}
public static void main(String[] args) {
int[] arr={3,4,5};
t3.bb(arr);
System.out.println(arr[0]);
}
}
输出结果:1
我们在对bb方法做一个修改
public void bb(int[] arr){
//arr[0]=1;
int[] arr2={1,2,3};
arr=arr2;
}
结果分析
对于数组而言,当我们创建一个数组之后,jvm为数组分配了三个连续的内存空间,这个arr就指向这片内存空间。方法bb得到的是数组的引用的一个拷贝
情况1修改了第一个空间块中的内容,故输出的是修改后的内容
情况2只是将arr的引用指向了另一片内存空间,原本的那片内存空间并未发生变化。
String类型
public class Test3 {
public void cc(String str){
str="cba";
}
public static void main(String[] args) {
String str="abc";
t3.cc(str);
System.out.println(str);
}
}
输出结果:abc
结果分析
String属于引用类型,传递的参数就是字符串所在的地址的一个拷贝,而方法cc实际上只是将这个拷贝的值指向了另一个地址,原本的那个地址并没有受到影响。
对象类型
对象类型的结果和数组,String一样,在这里我就不分析了。
总结
无论是基本类型还是引用类型,在方法传参时,都有一个拷贝的过程。
基本数据类型传递的是值的一个拷贝
引用类型传递的是引用的一个拷贝
不管是值传递还是引用传递,形参拿到的仅仅是实参的副本,而不是实参本身。
回到最初的问题,java是值传递还是引用传递了?
这个就看怎么理解了,我也不好说,但无论是什么传递,我们只要记住,方法在传递参数时,拿到只是实参的一个拷贝就行了。
网友评论