// 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