usar - Llamar a un método Java sin nombre
pasar objeto como parametro java (8)
Es un bloque de inicialización de instancia seguido de un bloque de inicialización estático .
{
System.out.print("y ");
}
se llama cuando crea una instancia de la clase.
static {
System.out.print("x ");
}
recibe una llamada cuando la clase es cargada por el cargador de clases. Entonces cuando lo haces
new Sequence().go();
la clase se carga, por lo que ejecuta static {}
, luego ejecuta el bloque de inicialización de instancia {}
, luego se llama al cuerpo del constructor y luego el método en la instancia recién creada. Ergo la salida xycg
.
Estoy mirando el siguiente código 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 produjese un error de compilación, ya que System.out
con "y" no pertenece a una declaración de método solo un { }
. ¿Por qué es esto válido? No veo cómo se debería o debería llamar este código.
Al ejecutar esto, también produce xycg
, ¿por qué se llama al static { }
antes del constructor de la secuencia?
Esta:
static {
System.out.print("x ");
}
es un bloque de inicialización estático , y se invoca cuando se carga la clase. Puede tener tantos de ellos en su clase como desee, y se ejecutarán en orden de aparición (de arriba a abajo).
Esta:
{
System.out.print("y ");
}
es un bloque de inicialización , y el código se copia al principio de cada constructor de la clase. Entonces, si tiene muchos constructores de su clase y todos necesitan hacer algo común al principio, solo necesita escribir el código una vez y colocarlo en un bloque de inicialización como este.
Por lo tanto, su producción tiene perfecto sentido.
Como Stanley comentó a continuación, consulte la sección del tutorial de Oracle que describe los bloques de inicialización para obtener más información.
No es un método sino un bloque de inicialización .
{
System.out.print("y ");
}
Se ejecutará antes de la llamada del constructor. Mientras
static {
System.out.print("x ");
}
es un bloque de inicialización estático que se ejecuta cuando la clase es cargada por el cargador de clases.
Entonces cuando ejecutas tu código
1. La clase es cargada por el cargador de clases para que se ejecute el bloque de inicialización estática
Salida: x está impreso
2. Se crea el objeto para que se ejecute el bloque de inicialización y luego se llame al constuctor
Salida: y se imprime seguido de c
3. Se invoca el método principal que a su vez invoca el método go
Salida: g está impreso
Salida final: xycg
Esto podría ayudar http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
Se usa como un bloque de inicialización y se ejecuta después de cualquier declaración estática . Se podría usar 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 de Singleton .
static {
System.out.print("x ");
}
Es un bloque estático y se llama durante la carga de clases
{
System.out.print("y ");
}
Es un bloque de inicialización
Puede tener múltiples 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.
static {
System.out.print("x ");
}
es un bloque de inicialización compartido por la clase (como se indica por static
), que se ejecuta primero.
{
System.out.print("y ");
}
es un bloque de inicialización compartido por todos los objetos (constructores) de la clase, que viene a continuación.
Sequence() {
System.out.print("c ");
}
es un constructor particular para la clase, que se ejecuta en tercer lugar. El bloque de inicialización de instancia se invoca primero cada vez que se ejecuta el constructor. Es por eso que "y" viene justo antes de "c".
void go() {
System.out.print("g ");
}
es solo un método de instancia asociado con objetos construidos usando el constructor anterior, que viene en último lugar.
static {
System.out.print("x ");
}
Static blocks
solo se ejecutan una vez cuando el JRE carga e inicializa la clase .
Y se llamará al bloque non-static
cada vez que esté creando una nueva instancia y se llamará justo antes del Constructor.
Como aquí ha creado solo 1 instancia de Sequence
se ha llamado a la construcción después non-static
bloques non-static
y luego al método que realmente es su objetivo.
{
System.out.print("y ");
}
Este tipo de bloques se llaman initializer block
. Se ejecuta cada vez que creas una instancia de una class
. En tiempo de compilación, este código se mueve a cada constructor de su clase.
Donde, como en el caso del bloque de static initializer
: -
static {
System.out.println("x ");
}
se ejecuta una vez cuando se carga la clase. Generalmente utilizamos static
bloque de inicializador static
cuando la inicialización de un campo static
requiere varios pasos.