que - Java: ¿Cuál es la diferencia entre<init> y<clinit>?
para que sirve el metodo initcomponents (4)
No puedo entender el siguiente texto ... ¿Significa que <clinit>
es para constructores vacíos? ¿Por qué es importante tener dos versiones diferentes?
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html
2.9. Special Methods
En el nivel de la máquina virtual Java, cada constructor (§2.12) aparece como un método de inicialización de instancia que tiene el nombre especial
<init>
. Este nombre es proporcionado por un compilador. Como el nombre<init>
no es un identificador válido, no se puede usar directamente en un programa escrito en el lenguaje de programación Java. Los métodos de inicialización de instancias pueden invocarse solo dentro de la máquina virtual Java mediante la instrucción invokespecial, y solo se pueden invocar en instancias de clase no inicializadas. Un método de inicialización de instancia asume los permisos de acceso (§2.7.4) del constructor del cual se deriva.Una clase o interfaz tiene como máximo un método de inicialización de clase o interfaz y se inicializa (§2.17.4) invocando ese método. El método de inicialización de una clase o interfaz es estático y no toma argumentos. Tiene el nombre especial
<clinit>
. Este nombre es proporcionado por un compilador. Debido a que el nombre<clinit>
no es un identificador válido, no se puede usar directamente en un programa escrito en el lenguaje de programación Java. Los métodos de inicialización de clase e interfaz son invocados implícitamente por la máquina virtual Java; nunca se invocan directamente desde cualquier máquina virtual Java inw2struction, sino que se invocan solo de forma indirecta como parte del proceso de inicialización de la clase.
La diferencia entre <init>
y <clinit>
es que <init>
se usa para los métodos de constructor que inicializan una instancia de objeto, mientras que <clinit>
se usa para inicializar el objeto de clase en sí. Por ejemplo, la inicialización de cualquier campo de nivel de clase static
se realiza en <clinit>
cuando la clase se carga e inicia.
Solo para agregar Si usa el método Class.forName, solo inicia la clase. Entonces, desde este método, realiza una llamada solo a clinit y cuando usa newInstance en el objeto devuelto por forName, llamará a init para la inicialización de la instancia. Puede usar el código a continuación para verlo en depuración.
public class ByteCodeParent
{
public static String name="ByteCode";
public ByteCodeParent()
{
System.out.println("In Constructor");
}
static
{
System.out.println("In Static");
}
{
System.out.println("In Instance");
}
Para probar, usa
Class<ByteCodeParent> bcp2 =(Class<ByteCodeParent>) Class.forName("ByteCodeParent");
ByteCodeParent bcp4= bcp2.newInstance();
<init>
denota un constructor, <clinit>
denota un inicializador estático : "Bloques de inicialización estática" en el Tutorial de Java , Inicializador estático en Java .
<init>
es el (o los) constructor (es) para la instancia y la inicialización de campo no estática.
<clinit>
son los bloques de inicialización estáticos para la clase y la inicialización del campo estático.
class X {
static Log log = LogFactory.getLog(); // <clinit>
private int x = 1; // <init>
X(){
// <init>
}
static {
// <clinit>
}
}