Estoy mirando el código a continuación y encontré algo un poco extraño:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Hubiera esperado que esto diera un error de compilación ya que System.out
con "y" no pertenece a una declaración de método solo a { }
. ¿Por qué es esto válido? No veo cómo se llamaría o debería llamarse este código.
Al ejecutar esto, x y c g
también produce , ¿por qué static { }
se llama antes del constructor de secuencia?
fuente
the code is copied into the beginning of each constructor of the class
- Esto es incorrecto. Digamos que el constructor comienza consuper("x ");
, el superconstructor se ejecutará antes de cualquier bloque de inicialización.No es un método sino un bloque de inicialización .
Se ejecutará antes de la llamada al constructor. Mientras
es un bloque de inicialización estático que se ejecuta cuando el cargador de clases carga la clase.
Entonces, cuando ejecuta su código
1. El cargador de clases carga la clase para que se ejecute el bloque de inicialización estático
Salida: se imprime x
2. Se crea el objeto para que se ejecute el bloque de inicialización y luego el constructor se llama
Salida: y se imprime seguido de c
3. Se invoca el método principal que a su vez invoca el método go
Salida: se imprime g
Resultado final: xycg
Esto podría ayudar http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
fuente
Ese es un bloque de inicialización de instancia seguido de un bloque de inicialización estático .
se llama cuando crea una instancia de la clase.
se llama cuando el cargador de clases carga la clase. Así que cuando lo hagas
la clase se carga, entonces se ejecuta
static {}
, luego ejecuta el bloque de inicialización de la instancia{}
, luego se llama al cuerpo del constructor y luego al método en la instancia recién creada. Ergo la salidax y c g
.fuente
Es un bloque estático y se llama durante la carga de clases.
Es un bloque de inicialización
Puede tener varios bloques de inicialización en una clase, en cuyo caso se ejecutan en la secuencia en la que aparecen en la clase.
Tenga en cuenta que cualquier bloque de inicialización presente en la clase se ejecuta antes que el constructor.
fuente
es un bloque de inicialización compartido por la clase (como lo indica
static
), que se ejecuta primero.es un bloque de inicialización compartido por todos los objetos (constructores) de la clase, que viene a continuación.
es un constructor particular para la clase, que se ejecuta en tercer lugar. El bloque de inicialización de la instancia se invoca primero cada vez que se ejecuta el constructor. Es por eso que "y" viene justo antes de "c".
es solo un método de instancia asociado con objetos construidos usando el constructor anterior, que es el último.
fuente
Este tipo de bloques se denominan
initializer block
. Se ejecuta cada vez que crea una instancia declass
. En tiempo de compilación, este código se mueve a cada constructor de su clase.Donde, como en el caso del
static initializer
bloque: -se ejecuta una vez cuando se carga la clase. Generalmente usamos el
static
bloque inicializador cuando la inicialización de unstatic
campo requiere varios pasos.fuente
Se utiliza como bloque de inicialización y se ejecuta después de cualquier declaración estática . Podría usarse para garantizar que nadie más pueda crear una instancia de la clase (de la misma manera que usaría un constructor privado) como con el patrón de diseño Singleton .
fuente
Static blocks
solo se ejecutan una vez cuando el JRE carga e inicializa la clase .Y
non-static
se llamará al bloque cada vez que esté creando una nueva instancia y se llamará justo antes del Constructor.Como aquí ha creado, solo
Sequence
se ha llamado 1 instancia de así construido después de losnon-static
bloques y luego el método que realmente es su objetivo.fuente