为什么x的值不会改变,你会如何改变它? - 理解方法

时间:2015-04-11 15:52:27

标签: java methods int

    static void number(int x){
        x=42;
    }


 public static void main(String[] args) {

    int x =17;
    number(x);
    System.out.println(x);

为什么打印出来的价值仍然是17而不是42?谢谢!

2 个答案:

答案 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并将其放入yxy之间没有正在进行的链接。

那你怎么改变它?通常的做法是让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的值是对列表的引用,该列表存在于内存的其他位置。

摘要要点:

  • 当您将“变量”传递给方法时,它是传递的变量的总是 - Java纯粹是按值传递[某些]其他语言有一些名为pass-by-reference的东西,其中传递了对变量的引用,但是Java没有这样的引用)
  • 将变量分配给另一个变量
  • 时会发生同样的事情
  • 对象引用是告诉JVM对象在内存中的值

答案 1 :(得分:0)

Java是按值传递因此当您将x中定义的main()传递给number()方法时,只会将该值复制到函数参数x并且没有地址传递的方式不同于C指针。所以你得到的值是17,因为它没有改变。