Java代码假设使用call by reference的执行结果及传参疑问
关于Java假设按Call by Reference执行代码的逻辑疑问
问题前提
给定一段Java代码,尽管Java本身采用call by value,但要求假设所有方法调用均使用call by reference,分析执行结果,核心疑问在于调用foo(x)时,形参y是指向变量x本身还是调用时x的取值。
原始代码
import java.util.Arrays; public class Main { static int x = 2; public static void main(String[] args) { int[] a = {17, 43, 12}; foo(a[x]); foo(x); foo(a[x]); System.out.println("x:" + x); System.out.println("a:" + Arrays.toString(a)); } static void foo(int y) { x = x - 1; y = y + 2; if (x < 0) { x = 5; } else if (x > 20) { x = 7; } System.out.println("y:" + y); } }
注:原代码缺少
import java.util.Arrays;,补充后保证编译逻辑完整。
用户的分析过程
- 调用
foo(a[x]):传入a[2](值为12),y变为12+2=14,x递减为1; - 调用
foo(x):传入x(值为1),认为x和y指向x的取值1,x递减为0后因y=y+2导致x变为3; - 调用
foo(a[x]):尝试传入a[3](数组越界),x递减为2; - 数组
a变为[17,43,14]。
用户得出的结果
y : 14; y : 3; y : ?; x : 2; a : 17,43,14
核心疑问
调用foo(x)时,y是指向变量x本身还是调用时x的取值?
正确分析(基于Call by Reference规则)
首先明确Call by Reference的核心:方法调用时,形参会直接绑定到实参的变量本身(内存地址),而非实参的当前值。对形参的任何修改,都会直接作用于原变量。
逐步骤执行过程
- 初始状态:静态变量
x=2,数组a={17,43,12} - 第一次调用
foo(a[x]):- 实参是数组元素
a[2](变量,而非值12),形参y绑定到a[2] - 执行
x = x-1→x变为1 - 执行
y = y+2→a[2]从12变为14 x=1不满足分支条件,输出y:14- 当前状态:
x=1,a={17,43,14}
- 实参是数组元素
- 第二次调用
foo(x):- 实参是变量
x,形参y直接绑定到静态变量x本身 - 执行
x = x-1→x从1变为0 - 执行
y = y+2→ 因为y绑定x,所以x从0变为0+2=2 x=2不满足分支条件,输出y:2- 当前状态:
x=2,a={17,43,14}
- 实参是变量
- 第三次调用
foo(a[x]):- 实参是
a[2](当前值14,变量),形参y绑定到a[2] - 执行
x = x-1→x从2变为1 - 执行
y = y+2→a[2]从14变为16 x=1不满足分支条件,输出y:16- 当前状态:
x=1,a={17,43,16}
- 实参是
- 最终输出:
- 打印
x:1 - 打印
a:[17, 43, 16]
- 打印
对核心疑问的解答
调用foo(x)时,y指向的是变量x本身,而非调用时x的取值。因为Call by Reference传递的是变量的引用(内存地址),形参会直接关联原变量的存储位置,对y的修改就是对原变量x的修改。
内容的提问来源于stack exchange,提问作者Ninaaaaa
相关产品推荐
相关产品推荐

