这个问题不用考虑太复杂,答案是值传递。
首先java中的数据类型有两种:基本类型和引用类型
基本类型的传递举个栗子:
public class App
{
public static void main( String[] args )
{
Integer i = 10;
changeInteger(i);
System.out.println(i);
}
public static void changeInteger(Integer j) {
j++;
System.out.println(j);
}
}
输出:
11
10
基本类型的传递是将值拷贝一份传给方法体作为入参,这份拷贝在方法体内的任何操作都不会影响之前值得改变。所以基本类型是值传递。
引用类型:
public class App
{
public static void main( String[] args )
{
Student student = new Student();
student.setName("fujian");
student.setClassName("class 2");
changeStudent(student);
System.out.println(student.toString());
}
public static void changeStudent(Student student) {
student.setName("changed");
student.setClassName("class 3");
System.out.println(student.toString());
}
}
输出:
name is changed and className is class 3
name is changed and className is class 3
引用类型是内存地址的传递,将之前student引用指向的内存地址传递给方法作为入参,方法体内对入参的修改操作是对之前内存地址上的对象的操作,所以会改变之前对象的属性,引用类型还是值传递,只是传递的是内存地址。
接下来看个栗子继续讲引用传递
public class App
{
public static void main( String[] args )
{
Student student = new Student();
student.setName("fujian");
student.setClassName("class 2");
changeStudent(student);
System.out.println(student.toString());
}
public static void changeStudent(Student student) {
student = new Student();
student.setName("changed");
student.setClassName("class 3");
System.out.println(student.toString());
}
}
输出:
name is changed and className is class 3
name is fujian and className is class 2
可以看到方法体内的一系列动作:起初将fujian这个student对象的内存地址值传递给方法体的形式参数name,然后name又指向了新的student的内存地址,所以之后的一系列操作均是操作的新的student的内存地址上的对象,不影响fujian这个对象。
总结:
java是值传递,基本类型是值拷贝的传递,引用类型是内存地址的值传递。