Mi pregunta es sobre un uso particular de la palabra clave estática. Es posible usar static
palabras clave para cubrir un bloque de código dentro de una clase que no pertenece a ninguna función. Por ejemplo, las siguientes compilaciones de código:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Si elimina la static
palabra clave, se queja porque la variable a
es final
. Sin embargo, es posible eliminar tanto final
y static
palabras clave y que se compile.
Es confuso para mí en ambos sentidos. ¿Cómo se supone que tengo una sección de código que no pertenece a ningún método? ¿Cómo es posible invocarlo? En general, ¿cuál es el propósito de este uso? O mejor, ¿dónde puedo encontrar documentación sobre esto?
fuente
public static void staticMethod(){}
, si ejecutaTestStatic.class.getMethod("staticMethod");
. El inicializador estático no se invocará. Más información aquí docs.oracle.com/javase/specs/jvms/se10/html/…Uff! ¿Qué es el inicializador estático?
El inicializador estático es un
static {}
bloque de código dentro de la clase java, y se ejecuta solo una vez antes de que se llame al constructor o al método principal.¡OKAY! Dime más...
static { ... }
dentro de cualquier clase de Java. y ejecutado por una máquina virtual cuando se llama a la clase.return
se admiten declaraciones.this
osuper
son compatibles.Hmm, ¿dónde puedo usarlo?
Se puede usar en cualquier lugar donde te sientas bien :) así de simple. Pero veo que la mayoría de las veces se usa cuando se realiza una conexión de base de datos, API init, Logging, etc.
¡No solo ladres! donde esta el ejemplo?
¿¿¿Salida???
¡Espero que esto ayude!
fuente
afterPropertiesSet()
deInitializingBean
?El
static
bloque es un "inicializador estático".Se invoca automáticamente cuando se carga la clase, y no hay otra forma de invocarla (ni siquiera a través de Reflection).
Personalmente, solo lo he usado al escribir código JNI:
fuente
Method
instancia, sino que solo es invocado por la máquina virtual Java.Esto es directamente de http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Orden de ejecución
Mira la siguiente clase, ¿sabes cuál se ejecuta primero?
Salida:
2. ¿Cómo funciona el inicializador de instancia de Java?
El inicializador de instancia anterior contiene una instrucción println. Para entender cómo funciona, podemos tratarla como una instrucción de asignación variable, por ejemplo,
b = 0
. Esto puede hacer que sea más obvio de entender.En vez de
int b = 0
podrías escribirPor lo tanto, los inicializadores de instancia y los inicializadores de variable de instancia son más o menos lo mismo.
3. ¿Cuándo son útiles los inicializadores de instancia?
El uso de inicializadores de instancia es raro, pero aún así puede ser una alternativa útil a los inicializadores de variable de instancia si:
Por supuesto, dicho código podría escribirse en constructores. Pero si una clase tuviera múltiples constructores, tendría que repetir el código en cada constructor.
Con un inicializador de instancia, puede escribir el código una vez y se ejecutará sin importar qué constructor se use para crear el objeto. (Supongo que esto es solo un concepto, y no se usa con frecuencia).
Otro caso en el que los inicializadores de instancia son útiles son las clases internas anónimas, que no pueden declarar ningún constructor. (¿Será este un buen lugar para colocar una función de registro?)
Gracias a Derhein.
También tenga en cuenta que las clases anónimas que implementan interfaces [1] no tienen constructores. Por lo tanto, se necesitan inicializadores de instancia para ejecutar cualquier tipo de expresiones en tiempo de construcción.
fuente
"final" garantiza que se debe inicializar una variable antes del final del código de inicializador del objeto. Del mismo modo, "static final" garantiza que una variable se inicializará al final del código de inicialización de clase. Omitir el "estático" de su código de inicialización lo convierte en código de inicialización de objeto; así su variable ya no cumple sus garantías.
fuente
No escribirá código en un bloque estático que deba invocarse en ningún lugar de su programa. Si se va a invocar el propósito del código, debe colocarlo en un método.
Puede escribir bloques de inicializador estático para inicializar variables estáticas cuando se carga la clase, pero este código puede ser más complejo.
Un bloque inicializador estático parece un método sin nombre, sin argumentos y sin tipo de retorno. Como nunca lo llamas, no necesita un nombre. El único momento en que se llama es cuando la máquina virtual carga la clase.
fuente
cuando un desarrollador usa un bloque de inicializador, el compilador de Java copia el inicializador en cada constructor de la clase actual.
Ejemplo:
el siguiente código:
es equivalente a:
Espero que los desarrolladores entiendan mi ejemplo.
fuente
El bloque de código estático se puede usar para crear instancias o inicializar variables de clase (a diferencia de las variables de objeto). Por lo tanto, declarar "a" estático significa que es solo uno compartido por todos los objetos de prueba, y el bloque de código estático inicializa "a" solo una vez, cuando la clase de prueba se carga por primera vez, sin importar cuántos objetos de prueba se creen.
fuente