- 无论是基本数据类型还是对象,在Java中都是通过值传递的。对于基本数据类型,传递的是值的副本拷贝,对参数的改变不会反映到原数据的值中。对于对象,传递的是对象的内存地址的副本拷贝,是内存地址的值
- 基本数据类型 a = 5,此时传给test方法是a的副本,注意并没有复制一个数值5,而是复制了变量a->副本a,这个副本a的值也是5;
public class Test { public static void main(String[] args) { int a = 5; test(a); System.out.println(a); // 这将输出5,因为a的值没有被test方法改变 } public static void test(int b) { b = 10; // 这里改变的是副本的值,不会影响原始变量a } }
- 引用数据类型,当使用
String a = "hello";
创建一个String
对象,并且随后调用test(a)
时,实际上传递的是对String
对象引用的副本,而不是String
对象内容的副本。对象的传递同样是对这个对象的引用的副本。两个引用指向的‘值’是同一个,因此调用到改变‘值’属性的方法时,是对同一个对象生效的;如果在方法中重新对引用赋值,改变的是副本的引用,此时再去修改内容,修改的就是新的对象内容,不会再影响原来的对象了;public static void main(String[] args) { String a = "hello"; test(a); System.out.println(a); // 这将输出"hello",因为a引用的对象没有被test方法改变 User u = new User(); u.setAge(5); test(u); System.out.println(u.getAge()); // 这将输出15 } public static void test(String b) { // b是a引用的一个副本,它们都指向同一个String对象 b = "world"; // 这里改变的是b引用的对象,a引用的对象仍然是"hello" } public static void test(User c) { // c是u的副本,它们指向同一个user对象 c.setAge(15); // 这里会改变user对象的age属性。 c = new User(); c.setAge(10);// 这里c被指向新的user对象了,此时设置了age=10,不影响u所指user对象的属性 }
java中的值传递
于 2024-04-10 15:25:53 首次发布