2012-04-05 14 views
12

¿El siguiente código es el caso de referencia legal directa? ¿si es así por qué?Referencias legales a Java Java

public class MyClass 
{ 
    private static int x = getValue(); 
    private static int y = 5; 
    private static int getValue() 
    { 
    return y; 
    } 
    public static void main(String[] args) 
    { 
    System.out.println(x); 
    } 
} 

Respuesta

19

El código anterior que tienes es perfectamente legal Java. En Java, los campos estáticos se inicializan de la siguiente manera: primero, todos los campos se configuran por defecto para su tipo (0, false o null) y luego se inicializan en el orden en que se declaran. Esto significa que el código anterior se garantiza para hacer lo siguiente:

  1. Conjunto x y y a cero, ya que es el valor por defecto para int s.
  2. Inicialice x llamando al getValue(), que lee el valor de y. Desde y aún no se ha inicializado, todavía tiene el valor 0.
  3. Inicializar y a 5.

Esto significa que x tomará el valor 0 y y tomará el valor 5. Este comportamiento se portátil y garantizado. You can see this here.

Espero que esto ayude!

+0

¿Cuál sería el caso si esas no fueran variables estáticas y método? – Vibhor

+2

Creo que el comportamiento es el mismo: la inicialización primero establece todo en el valor predeterminado, luego inicializa cada uno con el valor especificado y luego llama al constructor. – templatetypedef

+1

Cuál, por cierto, es una razón por la que nunca debes llamar a un método no final (o privado) de un constructor; es demasiado fácil para alguien anular ese método y ver un 'esto' aún no construido, incluso hasta el punto de ver un campo final no inicializado. – yshavit

5

Puede decir si es legal o no por el hecho de que compila; a diferencia de otros lenguajes, Java no tiene la noción de "comportamiento indefinido". Lo que sucede aquí está completamente explicado. Puede ser contradictorio, pero es específicamente legal: puede acceder a una variable estática antes de que se inicialice desde un método llamado al inicializar otra variable estática. El caso superficialmente similar de acceder y directamente de inicializador x 's - decir,

private static int x = y; 
private static int y = 5; 

está permitido específicamente. Realmente no hay una razón fuerte para eso, es solo cómo es.

+0

¿Qué pasa si las variables no son estáticas ... es el comportamiento mismo en ese caso también? – Vibhor

+0

Sí, es efectivamente lo mismo. Las reglas enumeradas para estadísticas son muy ligeramente diferentes porque no hay "constructores" reales para una clase, pero los objetos se inicializan esencialmente de la misma manera. Por ejemplo, las variables, los inicializadores y los bloques de instancia se anteponen, en orden de aparición, a cada constructor. Para estática, los inicializadores y los bloques estáticos se compilan, en orden, en un único método llamado '()'. –

+0

Tener un programa que pueda probarse con un compilador es un lujo cuando se trata de preguntas como esta me temo.Esto se toma de un examen simulado para el examen OCJP. Lo estoy aprendiendo ahora, y son estas estúpidas preguntas que son completamente sin sentido las que se burlan de la intención del examen. –