Java赋值运算符执行
作者:互联网
在Java中,我理解赋值求值为右操作数的值,因此x ==(y = x)等语句的求值为true.
但是,此代码输出错误.
public static void main(String[]args){
String x = "hello";
String y = "goodbye";
System.out.println(x.equals(x = y));
}
为什么是这样?在我的理解中,它首先评估(x = y),它将x的值赋值给x,然后返回y的值.然后评估x.equals(y),这应该是真的,因为x和y现在应该共享相同的引用,但相反,我得到了假.
这里发生了什么?
解决方法:
首先:这是一个有趣的问题,但绝不应该出现在“真正的代码”中,因为即使你知道它是如何工作的,分配你在同一行中调用的变量也会让人感到困惑.
这里发生的是这3个步骤:
>找出调用该方法的对象(即评估第一个x,这将导致对字符串“hello”的引用)
>弄清楚参数(即评估x = y,这将改变x指向字符串“goodbye”并返回对该字符串的引用)
>使用#2的结果作为参数调用方法等于#1的结果(分别将引用字符串“hello”和“goodbye”).
查看为该方法生成的字节代码可以清楚地表明(假设您精通Java字节码):
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String goodbye
5: astore_2
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: aload_1
10: aload_2
11: dup
12: astore_1
13: invokevirtual #5 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
16: invokevirtual #6 // Method java/io/PrintStream.println:(Z)V
19: return
第9行是上面的第1步(即评估x并记住该值).
第10-12行是第2步.它加载y,复制它(一次用于赋值,一次用于赋值表达式的返回值)并将其赋值给x.
第13行对第9行计算的结果和第10-12行的结果调用等于.
标签:java,string,assignment-operator,equals 来源: https://codeday.me/bug/20190910/1800966.html