结论:java参数传递总是采用值传递
补充:按值引用:表示方法接收的是调用者提供的值;
按引用传递:表示方法接收的是调用者提供的变量地址;
分析:
基本数据类型:
@org.junit.Test
public void test12() {
int result =10;
/*
* 这里将result作为参数传递到add()中,其实只是将result的值复制到add(int a)方法中的参数a上,
* 在方法中计算后,复制后a的值会变,而原来result的值不会进行改变
* */
add(result);
System.out.println(result);
}
public void add(int a){
a=a+5;
}
引用类型:
@org.junit.Test
public void test13() {
Student student = new Student();
student.setName("TEST");
student.setSalary(100);
/*
* 这里将student作为参数传递到addSalary()中,其实只是将student的值复制到addSalary(Student student)方法中的参数student上,
* 而student的值是对实例student的引用,相当于参数的值和原来的值都是对实例的引用,
* 并同时指向了一个实例,所以通过其中一个进行修改会修改实例的值
* */
student.addSalary(student);
System.out.println(student.getSalary());
}
public class Student {
public String name;
private int age;
private int salary;
public void addSalary(Student student){
this.salary =student.salary*3;
}
}
@org.junit.Test
public void test13() {
Student student = new Student();
student.setName("TEST");
student.setSalary(100);
Student student1 = new Student();
student.setName("TEST1");
student.setSalary(100);
System.out.println("交换前:student:"+student.hashCode()+",student1:"+student1.hashCode());
/*
*方法的参数的变量只是复制传入的值,并不是真正传入值,所以交换的是方法上的参数的变量,原来的值不会受到影响
* */
swap(student,student1);
System.out.println("交换后:student:"+student.hashCode()+",student1:"+student1.hashCode());
}
public void swap(Student s,Student s1){
System.out.println("交换前:s:"+s.hashCode()+",s1:"+s1.hashCode());
Student temp =s;
s=s1;
s1=temp;
System.out.println("交换后:s:"+s.hashCode()+",s1:"+s1.hashCode());
}