2011-08-01 13 views

Respuesta

6

Usted necesita entender 2 conceptos aquí: Java de izquierda a derecha regla de cálculo de y efecto lado.

"A"+new C() 

siguiendo la misma regla. Primero se pone "A", que es un literal String, colócalo en algún lugar. Entonces evaluar

new C() 

que construir un C Object primero, a continuación, invocar toString() método de C de objetos, y obtiene el valor de objeto C, que es "C", luego concatena "A" y "C" juntos, y println "AC".

Dentro del método toString() del objeto C, hay un System.out.print("B"); que se invoca cuando Java evalúa la expresión anterior. Se imprime antes de completar la evaluación.
Es por ello que "B" se imprime primero

+0

gracias por su respuesta :) – dennis

9

La evaluación es algo como:

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" 

Como se puede ver, el orden de las declaraciones de impresión es "B", "A", "C "

+0

gracias por su respuesta :) – dennis

2

Debido a que el new C() se convierte en una cadena, y entonces pasa a println(). Básicamente, esto es lo que sucede:

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" 

yo sepa (no estoy seguro al 100%) utiliza la concatenación de cadenas String#valueOf(Object) en lugar de llamar directamente Object#toString(). Es por eso que "foo" + null es "foonull" en lugar de [throw a NullPointerException].

+0

gracias por su respuesta :) – dennis

+0

De nada. –

Cuestiones relacionadas