Iniciadores estaticos
Hola a todos:
Soy nuevo por aqui, y estoy empezando con Java. Para aprender estoy siguiendo el libro de Bruce Eckel "Piensa en Java". Esta muy bien, pero hay temas que se me escapan un poco.
Uno de ellos es el de los iniciadores estaticos.
No me queda bien claro la diferencia que hay entre:
static Taza c1;
static Taza c2;
static
{
c1 = new Taza c1;
c2 = new Taza c2;
}
y
static Taza c1=new Taza c1;
static Taza c2=new Taza c2;
Espero me lo podais aclarar.
Gracias
Soy nuevo por aqui, y estoy empezando con Java. Para aprender estoy siguiendo el libro de Bruce Eckel "Piensa en Java". Esta muy bien, pero hay temas que se me escapan un poco.
Uno de ellos es el de los iniciadores estaticos.
No me queda bien claro la diferencia que hay entre:
static Taza c1;
static Taza c2;
static
{
c1 = new Taza c1;
c2 = new Taza c2;
}
y
static Taza c1=new Taza c1;
static Taza c2=new Taza c2;
Espero me lo podais aclarar.
Gracias
Que yo sepa no hay ninguna diferencia en ese caso, es más bien cuestión de gustos; el bloque de iniciación estático es útil cuando quieres ejecutar instrucciones, por ejemplo, imagina que tienes un array de boolean y quieres que inicialmente todos los valores estén a true:
private static boolean [] matriz;
static{
matriz=new boolean[10];
java.util.Arrays.fill(matriz,true);
}
Espero haberte aclarado la utilidad del bloque de inicialización estática.
private static boolean [] matriz;
static{
matriz=new boolean[10];
java.util.Arrays.fill(matriz,true);
}
Espero haberte aclarado la utilidad del bloque de inicialización estática.
Hola:
En realidad sí hay diferencia, pero no creo que afecten al 99.9% de las aplicaciones. La diferencia es el momento en que se ejecuta la inicializacion.
Si haces por ejemplo
static Taza c1 = new Taza();
se que esta inicializacion se ejecuta en el momento que accedes por primera vez al atributo "c1". Esto es útil para cosas que son costosas de crear, así se crean en el momento que se necesita.
En cuanto al código entre llaves, no sé muy bien cuando se ejecuta, si al referenciar la clase por primera vez (cuando el ClassLoader la carga) o en qué momento. Desde luego, en el momento que le de por ejecutarlo, inicializará los dos atributos a la vez.
Es cuestion de hacer una clase Taza con un System.out. en el constructor y probar en ambos casos cuándo se realiza el new de dicha clase.
Se bueno
Si lo haces con el código entre llaves no
En realidad sí hay diferencia, pero no creo que afecten al 99.9% de las aplicaciones. La diferencia es el momento en que se ejecuta la inicializacion.
Si haces por ejemplo
static Taza c1 = new Taza();
se que esta inicializacion se ejecuta en el momento que accedes por primera vez al atributo "c1". Esto es útil para cosas que son costosas de crear, así se crean en el momento que se necesita.
En cuanto al código entre llaves, no sé muy bien cuando se ejecuta, si al referenciar la clase por primera vez (cuando el ClassLoader la carga) o en qué momento. Desde luego, en el momento que le de por ejecutarlo, inicializará los dos atributos a la vez.
Es cuestion de hacer una clase Taza con un System.out. en el constructor y probar en ambos casos cuándo se realiza el new de dicha clase.
Se bueno
Si lo haces con el código entre llaves no
Hola,
yo estoy con Diego. Si ejecutáis este código:
public class T1 {
private static ClassA a = new ClassA("a");
private static ClassA a1;
static {
a1 = new ClassA("a1");
}
public static void main(String[] args) {
}
private static class ClassA {
private ClassA(String id) {
System.out.println("ClassA constructor: " + id);
}
}
}
esta es la salida:
ClassA constructor: a
ClassA constructor: a1
yo estoy con Diego. Si ejecutáis este código:
public class T1 {
private static ClassA a = new ClassA("a");
private static ClassA a1;
static {
a1 = new ClassA("a1");
}
public static void main(String[] args) {
}
private static class ClassA {
private ClassA(String id) {
System.out.println("ClassA constructor: " + id);
}
}
}
esta es la salida:
ClassA constructor: a
ClassA constructor: a1
