2011-08-01 5 views

Trả lời

6

Bạn cần hiểu 2 khái niệm ở đây: Java trái sang phải quy tắc đánh giá và hiệu quả bên.

"A"+new C() 

theo cùng quy tắc. Nó được "A" đầu tiên, mà là một String literal, đặt nó ở đâu đó. Sau đó, nó đánh giá

new C() 

nó xây dựng một C Object đầu tiên, sau đó gọi toString() phương pháp của C Object, và nhận được giá trị của đối tượng C, đó là "C", sau đó móc nối "A" và "C" với nhau, và println "AC".

Bên trong phương thức toString() của đối tượng C, có System.out.print("B"); được gọi khi Java đánh giá biểu thức trên. Nó được in ra trước khi đánh giá hoàn thành.
Đó là lý do tại sao "B" được in đầu tiên

+0

cảm ơn câu trả lời của bạn :) – dennis

9

Việc đánh giá đi một cái gì đó như:

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" 

Như bạn có thể thấy, thứ tự của các báo cáo in là "B", "A", "C "

+0

cảm ơn câu trả lời của bạn :) – dennis

2

new C() được chuyển đổi thành chuỗi và rồi được chuyển đến println(). Về cơ bản, đây là những gì sẽ xảy ra:

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 (Tôi không chắc chắn 100%) nối chuỗi sử dụng String#valueOf(Object) hơn là trực tiếp gọi Object#toString(). Đó là lý do tại sao "foo" + null"foonull" thay vì [throw a NullPointerException].

+0

cảm ơn câu trả lời của bạn :) – dennis

+0

Bạn được chào đón. –