Java 更改MethodHeaders中的参数

Java 更改MethodHeaders中的参数,java,Java,我在一个旧项目中发现了一些旧代码。我不明白它是怎么工作的。 让我们看一看 public class Test{ int someNumber = 1337; public void someMethode(){ calledMethode(someNumber, someNumber=42); } public void calledMethode(int _oldValue, int _newValue) { System.out.println("Show _old

我在一个旧项目中发现了一些旧代码。我不明白它是怎么工作的。 让我们看一看

public class Test{

int someNumber = 1337;

public void someMethode(){
    calledMethode(someNumber, someNumber=42);
  }

public void calledMethode(int _oldValue, int _newValue) {
    System.out.println("Show _oldValue: "+_oldValue);
    System.out.println("Show _newValue: "+_newValue);
  }
}
我希望结果是:

Show _oldValue: 42
Show _newValue: 42
事实上,我得到了以下结果:

Show _oldValue: 1337
Show _newValue: 42

为什么会这样?谢谢你的帮助,祝你度过愉快的一天

结果是预期的,原因是子表达式从左到右求值

class Test1 {
    public static void main(String[] args) {
        String s = "going, ";
        print3(s, s, s = "gone");
    }
    static void print3(String a, String b, String c) {
        System.out.println(a + b + c);
    }
}
给出结果:走,走,走


请参阅

行为是否正确。查看下面的
someMethode()
字节码。
someNumber
值首先加载到堆栈中,然后推送新值。当我们调用该方法时,JVM将从堆栈中加载旧值和新值

  public void someMethode();
    Code:
       0: aload_0
       1: aload_0
       2: getfield      #7                  // Field someNumber:I
       5: aload_0
       6: bipush        42
       8: dup_x1
       9: putfield      #7                  // Field someNumber:I
      12: invokevirtual #13                 // Method calledMethode:(II)V
      15: return
阅读

简单回答:

public class Test{

int someNumber = 1337;

public void someMethode(){
    calledMethode(someNumber, someNumber=42);
  }

public void calledMethode(int _oldValue, int _newValue) {
    System.out.println("Show _oldValue: "+_oldValue);
    System.out.println("Show _newValue: "+_newValue);
  }
}
在方法-someMethode中,您要传递两个参数,第一个参数是someNumber,正如您在类的开头声明的,它包含1337。因此,1337将被传递,但在第二个参数中,您已使用新值42重新分配变量someNumber,因此42将被传递

如果希望输出为42,42,则代码应如下所示:

public class Test{

int someNumber = 42;

public void someMethode(){
    calledMethode(someNumber, someNumber);
  }

public void calledMethode(int _oldValue, int _newValue) {
    System.out.println("Show _oldValue: "+_oldValue);
    System.out.println("Show _newValue: "+_newValue);
  }
}