2012-08-31 12 views
5
public class Main { 
    public static void main(String[] args){ 
     System.out.println(X.Y.Z); 
    } 
} 

class X { 
    static class Y { 
     static String Z = "Result 1"; 
    } 
    static C Y = new C(); 
} 

class C { 
    String Z = "Result 2"; 
} 

salida algún momento y en algún momento es "Result 1" salida es "Result 2". ¿Puedes explicar porque?salida diferente después de la clase principal de la ejecución

Estoy usando JDK 1.6_33.

+0

Con JDK 1.6.24, obtengo 'Result 2' cada vez. – mellamokb

+0

@mellamokb Yo también. Cada vez. –

+1

Descargué JDK 1.6.33, y compilé y ejecuté el fragmento de código 20 veces. Obtuve 'Result 2' cada vez. – mellamokb

Respuesta

9

Este es Java Puzzler # 68 - siempre debe imprimir Result 2. Cita:

Resulta que hay una regla que rige el comportamiento del programa en estas circunstancias. Cuando una variable y un tipo tienen el mismo nombre y ambos están dentro del alcance, el nombre de la variable toma precedencia [JLS 6.5.2]. Se dice que el nombre de la variable oculta el nombre del tipo [JLS 6.3.2]. Del mismo modo, los nombres de variable y tipo pueden ocultar los nombres de los paquetes. Esta regla es ciertamente oscura, y cualquier programa que dependa de él puede confundir a sus lectores.

+4

Y cualquier código de escritura que se base en esto debería estar en tar y pluma. – biziclop

+0

¿Dónde puedo ver este rompecabezas de Java? – Ilya

+0

http://www.javapuzzlers.com/ – assylias

Cuestiones relacionadas