// C.java
class C {
public static void main(String arg[]) {
System.out.println("A"+new C());
}
public String toString() {
System.out.print("B");
return "C";
}
}
// output:
// BAC
您需要在这里理解2个概念:Java从左到右的评估规则和副作用.
"A"+new C()
遵循同样的规则.首先得到“A”,这是一个字符串文字,把它放在某个地方.然后它评估
new C()
它首先构造一个C Object,然后调用C Object的toString()方法,得到C对象的值,即“C”,然后将“A”和“C”连接在一起,然后打印“AC”.
在C Object的toString()方法中,有一个System.out.print(“B”);
当Java评估上面的表达式时调用它.它在评估完成之前打印出来.
这就是为什么首先打印“B”的原因
翻译自:https://stackoverflow.com/questions/6893625/java-why-the-following-code-print-out-bac-instead-of-abc