直接上例子
第一个方法尝试交换三个成员的数组中的首尾成员。
第二个方法尝试交换两个整形变量的值。
第三个方法传递一个对象,方法内新增一个对象,按照传来的对象的值进行赋值。
import com.Person;
public class Test{
public static void main(String[] args) {
int[] a = {1,2,3};
int b = 1;
int c = 2;
change(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
System.out.println("~~~~~~~~~~~");
change2(b,c);
System.out.println(b);
System.out.println(c);
System.out.println("~~~~~~~~~~~");
Person person = new Person();
person.age = 20;
person.name = "mike";
change3(person);
System.out.println(person.age);
System.out.println(person.name);
}
public static void change(int[] arr){
int [] b = arr;
b[1] = 99;
int t = b[0];
b[0] = b[2];
b[2] = t;
}
public static void change2(int a,int b){
int t = a;
a = b;
b = t;
}
public static void change3(Person p){
Person p1 = new Person();
p1.age = p.age;
p1.name = p.name;
p1.age = 33;
p1.name = "smart";
}
}
编译,运行,输出结果:
3
99
1
~~~~~~~~~~~
1
2
~~~~~~~~~~~
20
mike
当传递数组为参数时,交换了元素。
当传递基本数据类型时,并没有达到期望中的交换数据值的效果。
当传递的是对象时,把基本数据类型的对象成员变量赋给另一个对象的成员变量时,依然是传递的值。当另一个对象的成员变量发生改变时,原对象成员变量的值不会改变。
可见,用通俗的话来讲,当参数为基本数据类型时(int char short byte…)传递的参数可以看做是按值传递,
当参数为对象时,传递的参数可以看做是按引用来传递。
补充一下,实际上,change(int[] arr) 方法接收参数后仍然可以看作是值传递。因为方法内部的局部变量b指向的内容与a指向同一块堆内存。
综上所述,java方法参数是按值传递的。
补充:
请看如下例程:
public class RefTest{
public static void main(String[] args) {
int i = 99;
String str = "China";
int[] nums = {1,2,3};
final int[] num2 = {1,2,3};
change(i);
changeString(str);
changeArray(nums);
changeArray(num2);
System.out.println(i);
System.out.println(str);
System.out.println(nums[0]);
System.out.println(num2[0]);
}
static void change(int i){
i = 9;
}
static void changeString(String s){
s = "USA";
}
static void changeArray(int[] is){
is[0] = -1;
}
}
输出如下:
99
China
-1
-1