2011-08-01 34 views

回答

6

您需要了解这里的2个概念:Java的左到右的评价规则副作用

"A"+new C() 

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

new C() 

它构建一个C Object第一,然后调用C对象的toString()方法,并得到C对象,这是“C”的值,然后串接“A”和“C”在一起,并且println“AC”。

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

+0

感谢您的回答:) – dennis

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 “

+0

感谢您的回答:) – dennis

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" 

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

+0

感谢您的回答:) – dennis

+0

不客气。 –

相关问题