static void number(int x){
x=42;
}
public static void main(String[] args) {
int x =17;
number(x);
System.out.println(x);
为什么打印出来的价值仍然是17而不是42?谢谢!
答案 0 :(得分:1)
该行
number(x);
将x
的值传递给number
。什么都没有链接回x
的内容。在number
内,您声明的x
参数与x
中的main
变量没有任何关联;它只会收到您传递给number
的值。分配参数(x = 42
)只会改变参数的值,而不是main
中的变量。
这称为按值传递,这意味着无论何时将变量传递给方法,都会传递该变量的值,而不是关于变量的任何内容本身。完全相同的事情发生在这里:
x = 17;
y = x;
y = 42;
System.out.println(x); // 17
System.out.println(y); // 42
y = x
只需获取x
的值并将其放入y
。 x
和y
之间没有正在进行的链接。
那你怎么改变它?通常的做法是让number
返回一个新值:
int number(int val) {
return val * 2;
}
然后在main
:
x = 17;
x = number(x);
System.out.println(x); // 43
有时候,当涉及对象引用时,人们会被pass-by-value弄糊涂。变量直接包含int
之类的基元,但它们不直接包含对象;它们包含对象引用。所以考虑一下:
List<String> l1 = new LinkedList<String>();
现在,l1
包含一个值,该值是对链接列表对象的引用。现在假设我们这样做:
List<String> l2 = l1;
那里发生了什么?我们有一个或两个清单吗?
答案当然是:我们从l1
复制到l2
的值是对列表的引用,该列表存在于内存的其他位置。
摘要要点:
答案 1 :(得分:0)
Java是按值传递因此当您将x
中定义的main()
传递给number()
方法时,只会将该值复制到函数参数x
并且没有地址传递的方式不同于C
指针。所以你得到的值是17
,因为它没有改变。