Java中如何通过call方法修改int类型变量的值
问题原因
Java的参数传递采用值传递机制:
- 对于int、char等基本数据类型,传递的是变量值的副本,方法内部对副本的修改完全不会作用到原变量上
- 你之前能通过方法修改数组内容,是因为数组属于引用类型,传递的是堆内存中数组对象的引用副本,两个引用指向同一个存储对象,修改对象的内容会同步生效,和基本类型的传递逻辑有本质区别
可行的解决方法
方法1:接收方法的返回值赋值给原变量
你当前的call方法已经返回了修改后的值,只需要把返回值重新赋值给main方法里的n即可:
import java.util.*; public class Main { private static int call(int n) { n = n - 1; return n; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n = 5; // 接收返回值覆盖原变量 n = call(n); System.out.println(n); // 输出4 } }
方法2:用长度为1的基本类型数组包装(适合void返回值场景)
参考你修改数组的思路,把int放到长度为1的数组里传递即可:
import java.util.*; public class Main { private static void call(int[] nArr) { nArr[0] = nArr[0] - 1; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); int[] nArr = {5}; call(nArr); System.out.println(nArr[0]); // 输出4 } }
方法3:使用可变引用类型包装类
可以用java.util.concurrent.atomic.AtomicInteger这个可变的整数包装类实现修改:
import java.util.*; import java.util.concurrent.atomic.AtomicInteger; public class Main { private static void call(AtomicInteger n) { // 原子减1操作 n.decrementAndGet(); } public static void main(String args[]) { Scanner sc = new Scanner(System.in); AtomicInteger n = new AtomicInteger(5); call(n); System.out.println(n.get()); // 输出4 } }
内容的提问来源于stack exchange,提问作者Deepak Silver
相关产品推荐
相关产品推荐

