这个问题不用考虑太复杂,答案是值传递。
首先java中的数据类型有两种:基本类型和引用类型java
基本类型的传递举个栗子:web
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); } }
输出:svg
11 10
基本类型的传递是将值拷贝一份传给方法体做为入参,这份拷贝在方法体内的任何操做都不会影响以前值得改变。因此基本类型是值传递。code
引用类型:xml
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引用指向的内存地址传递给方法做为入参,方法体内对入参的修改操做是对以前内存地址上的对象的操做,因此会改变以前对象的属性,引用类型仍是值传递,只是传递的是内存地址。内存
接下来看个栗子继续讲引用传递it
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()); } }
输出:class
name is changed and className is class 3 name is fujian and className is class 2
能够看到方法体内的一系列动做:起初将fujian这个student对象的内存地址值传递给方法体的形式参数name,而后name又指向了新的student的内存地址,因此以后的一系列操做均是操做的新的student的内存地址上的对象,不影响fujian这个对象。webkit
总结: java是值传递,基本类型是值拷贝的传递,引用类型是内存地址的值传递。