valores usar retornan que pasar parametro objeto metodos como java initializer

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.