Java - 为什么以下代码打印出“BAC”而不是“ABC”?

时间:2011-08-01 02:01:38

标签: java tostring

请帮我理解这段代码。我是java的新手。

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

3 个答案:

答案 0 :(得分:9)

评估结果如下:

Call println("A" + new C())
Since new C() hasn't been computed yet, we need to compute it, so...
Compute new C().toString()
    Print "B"
Print line with "A" + "C"

如您所见,打印语句的顺序为“B”,“A”,“C”

答案 1 :(得分:6)

您需要了解以下两个概念: Java从左到右评估规则副作用

"A"+new C()

遵循同样的规则。首先得到“A”,这是一个字符串文字,把它放在某个地方。然后评估

new C() 

首先构造一个C Object,然后调用C Object的toString()方法,并获取C对象的值,即“C”,然后连接“A }“和”C“在一起,并打印”AC“。

在C对象的toString()方法中,有一个System.out.print("B"); 当Java评估上面的表达式时调用它。在评估完成之前打印出来 这就是为什么首先打印“B”的原因

答案 2 :(得分:2)

因为new C()转换为字符串,然后传递给println()。基本上,这是发生的事情:

1. Concatenate "A" with new C():
  a. Call String.valueOf(new C()):
    i. print "B"
    ii. return "C"
  b. Concatenate "A" and "C"
2. Pass "AC" to println
3. Print "AC"

AFAIK(我不是100%肯定)字符串连接使用String#valueOf(Object)而不是直接调用Object#toString()。这就是为什么"foo" + null"foonull"而不是[throw a NullPointerException]